0

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

Ниже приведены мои коды

Manifest

<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); я получаю красную линию, которая говорит

enter image description here

Я попытался ввести проверку прав доступа, но не может добиться успеха, так как я новичок так я столкнулся с трудностями нахождения правильное решение (s)

Update 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 с ошибкой `Ошибка: Не удалось завершить выполнение задачи для ': приложение: transformClassesWithDexForDebug.

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536`

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

ответ

1

Для Android Version >= M, разрешение должно быть предложено во время выполнения, который не может быть сделано автоматически. A общий 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)); 
     } 
    } 

Handle разрешение:

@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); 
     } 
    //} 
} 
+0

Под 'this' я с красной линией – faisal1208

+0

использование' getActivity() 'вместо' this' потому что вы внутри 'fragment'. – W4R10CK

+0

Да, да, я понял, еще одно, я хочу спросить, где положить 'onRequestPermissionsResult' – faisal1208

Смежные вопросы