Карта Google не загружается на мое устройство с приложением

Я новичок в Android-разработке. Я учусь самостоятельно, используя Интернет и следуя учебникам. Я делаю приложение, в котором есть 3 tabs, одно для location, второе для camera, а третье для pictures. Для этого я использую tabbed activity внутри android studio. Внутри я использую mapView и следовал этому учебнику и выполнял каждый используемый в нем шаг. Кроме того, у меня есть apiKey для карты Google.

Ниже мои коды

Манифест

<uses-permission android:name="com.example.accurat.faisal.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"
    />
 <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="AIzaSyBhhxKOLbX2I3kNbsZy8lbSXtjuAijKL94"
        />

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Location.java

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // inflat and return the layout
    View rootView = inflater.inflate(R.layout.my_location, container, false);

    mMapView = (MapView)rootView.findViewById(R.id.mapView);
    mMapView.onCreate(savedInstanceState);

    mMapView.onResume();

    try
    {
        MapsInitializer.initialize(getActivity().getApplicationContext());
    }catch (Exception e)
    {
        e.printStackTrace();
    }

    mMapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(GoogleMap googleMap) {


            googleMap.setMyLocationEnabled(true);

            LatLng loc = new LatLng(31.492370,74.329060);

            googleMap.addMarker(new MarkerOptions().position(loc).title("I am here"));

            // For zooming automatically to the location of the marker
            CameraPosition cameraPosition = new CameraPosition.Builder().target(loc).zoom(12).build();
            googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));


        }
    });


    return rootView;

}

Расположение

<TextView
    android:id="@+id/section_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<com.google.android.gms.maps.MapView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/mapView" />

Более того, в googleMap.setMyLocationEnabled(true); я получаю красную строку, которая говорит

введите здесь описание изображения

Я пытался ввести проверку разрешений, но не смог добиться успеха, так как я новичок, поэтому я сталкиваюсь с трудностями в поиске правильного решения (решений).

Обновление 1

После обновления мой код выглядит так

 mMapView.getMapAsync(new OnMapReadyCallback() {

        @Override
        public void onMapReady(GoogleMap googleMap) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

                if(ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                        && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
                {
                    requestPermissions(new String[]{
                            Manifest.permission.ACCESS_COARSE_LOCATION,
                            Manifest.permission.ACCESS_FINE_LOCATION
                    },1);
                }
                else
                {
                    googleMap.setMyLocationEnabled(true);
                    LatLng loc = new LatLng(31.492370,74.329060);
                    googleMap.addMarker(new MarkerOptions().position(loc).title("I am Here"));
                    // For zooming automatically to the location of the marker
                    CameraPosition cameraPosition = new CameraPosition.Builder().target(loc).zoom(12).build();
                    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
                }
            }

        }
    });

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                //finish();
            }
            return;
        }
        // other 'case' lines to check for other
        // permissions this app might request
    }
}

Я тестирую его на своем устройстве Android API 16, и он дает мне build failed с ошибкой «Ошибка: не удалось выполнить задачу»: app:transformClassesWithDexForDebug.

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: идентификатор метода не в [0, 0xffff]: 65536`

Любая помощь будет оценена


person Moeez    schedule 26.01.2017    source источник


Ответы (1)


Для Android Version >= M разрешение необходимо запрашивать во время выполнения, что невозможно сделать автоматически. Общий Runtime Permission код запроса. Используйте getActivity(), если внутри Fragment вместо this.

    @Override
    public void onMapReady(GoogleMap googleMap) {


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if(ActivityCompat.checkSelfPermission
                (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                &&
                ActivityCompat.checkSelfPermission
                        (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
        {
            requestPermissions(new String[]{
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION
            }, 1);
            //return;
        }
     else{
        googleMap.setMyLocationEnabled(true);

        LatLng loc = new LatLng(31.492370,74.329060);

        googleMap.addMarker(new MarkerOptions().position(loc).title("I am here"));

        // For zooming automatically to the location of the marker
        CameraPosition cameraPosition = new CameraPosition.Builder().target(loc).zoom(12).build();
        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
      }
    }

Разрешение на обработку:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

            case 1:
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED){
                    // permission not granted
                }
                else {
                    // permission granted
                }
                break;
            //default:
                //super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    //}
}
person W4R10CK    schedule 26.01.2017
comment
Под this у меня красная линия - person Moeez; 26.01.2017
comment
используйте getActivity() вместо this, потому что вы находитесь внутри fragment. - person W4R10CK; 26.01.2017
comment
да да я понял, еще кое-что я хочу спросить, куда поставить onRequestPermissionsResult - person Moeez; 26.01.2017
comment
вне всех методов, но внутри класса. - person W4R10CK; 26.01.2017
comment
Извините, я вчера закончил, сейчас реализую - person Moeez; 27.01.2017
comment
Давайте продолжим обсуждение в чате. - person Moeez; 27.01.2017