2015-10-29 16 views
9

mia app sta tentando di accedere alla posizione del dispositivo e ho incluso quanto segue nella AndroidManifest.xml:ACCESS_FINE_LOCATION SecurityException nonostante specificando l'autorizzazione nel file manifesto

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.app"> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

    <application> 
     <meta-data android:name="com.google.android.gms.version" /> 
    </application> 

</manifest> 

Ho implementato il GoogleApiClient.ConnectionCallbacks come segue per accedere al percorso servizio:

public class BackgroundLocationService implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    private static final String TAG = BackgroundLocationService.class.getSimpleName(); 

    private static GoogleApiClient googleApiClient; 
    private static PendingIntent locationCallback; 

    public static int LOCATION_INTERVAL = 10000; 
    public static int FAST_INTERVAL = 5000; 

    @Override 
    public void onConnected(Bundle bundle) { 
     Log.i(TAG, "Connected to Google API"); 

     LocationRequest request = new LocationRequest(); 
     request.setInterval(LOCATION_INTERVAL); 
     request.setFastestInterval(FAST_INTERVAL); 
     request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

     LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, request, locationCallback); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Log.i(TAG, Integer.toString(i)); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Log.i(TAG, connectionResult.toString()); 
    } 
} 

Quando ho innescare la chiamata di servizio di localizzazione, la seguente eccezione viene generata:

java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations. 
    at android.os.Parcel.readException(Parcel.java:1599) 
    at android.os.Parcel.readException(Parcel.java:1552) 
    at com.google.android.gms.location.internal.zzi$zza$zza.zza(Unknown Source) 
    at com.google.android.gms.location.internal.zzk.zza(Unknown Source) 
    at com.google.android.gms.location.internal.zzl.zza(Unknown Source) 
    at com.google.android.gms.location.internal.zzd$7.zza(Unknown Source) 
    at com.google.android.gms.location.internal.zzd$7.zza(Unknown Source) 
    at com.google.android.gms.internal.zzlb$zza.zzb(Unknown Source) 
    at com.google.android.gms.internal.zzlf.zza(Unknown Source) 
    at com.google.android.gms.internal.zzlf.zzb(Unknown Source) 
    at com.google.android.gms.internal.zzli.zzb(Unknown Source) 
    at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source) 
    at com.localz.spotzpush.sdk.service.BackgroundLocationService.onConnected(BackgroundLocationService.java:45) 
    at com.google.android.gms.common.internal.zzk.zzh(Unknown Source) 
    at com.google.android.gms.internal.zzlg.zznU(Unknown Source) 
    at com.google.android.gms.internal.zzlg.onConnected(Unknown Source) 
    at com.google.android.gms.internal.zzli$2.onConnected(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zzg.zzpf(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zza.zzt(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zzc.zzph(Unknown Source) 
    at com.google.android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Sto utilizzando un dispositivo reale per produrre questo problema e mi sono grattato il motivo per cui viene generata l'eccezione.

+0

Qual è il tuo 'minSdkVersion' e' targetSdkVersion'? – JBirdVegas

+0

Ehi @JBirdVegas, sono rispettivamente 15 e 23 – gyamana

risposta

14

Il problema è stato causato da una nuova funzionalità per Android 6.0.

A partire da Android 6.0 (livello API 23), gli utenti concedono le autorizzazioni alle app mentre l'app è in esecuzione, non quando installano l'app.

http://developer.android.com/training/permissions/requesting.html

per aggirare il problema quando l'autorizzazione non è esplicitamente concesso, avevo messo in un assegno per avvolgere le chiamate di servizio posizione (come da documentazione di Google, leggermente modificato).

int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION); 

if (permissionCheck == PackageManager.PERMISSION_GRANTED) { 
    //Execute location service call if user has explicitly granted ACCESS_FINE_LOCATION.. 
} 

La documentazione di Google descrive anche come richiedere le autorizzazioni necessarie.

AGGIORNATO 12 ° ott 2016

Aggiungendo s' @Siddharth aggiornamento per includere una risposta più utile per checkSelfPermission()

//For this example, run the check onResume() 
@Override 
public void onResume() { 

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

     } else { 

      // No explanation needed, we can request the permission. 
      // PERMISSION_REQUEST_ACCESS_FINE_LOCATION can be any unique int 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_ACCESS_FINE_LOCATION); 
     } 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case PERMISSION_REQUEST_ACCESS_FINE_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
+1

Mi presento java.lang.SecurityException: il cliente deve disporre dell'autorizzazione ACCESS_FINE_LOCATION per richiedere le posizioni PRIORITY_HIGH_ACCURACY. arresto anomalo con Target SDK 22 su Android 5.1 (Device is S plus (GiONEE_WBL7511)) Eventuali indizi? – arpitgoyal2008

+0

Si prega di rivedere la mia risposta e apportare le correzioni appropriate. Cancellerò la mia risposta se puoi apportare correzioni alla tua risposta. – Siddharth

+0

@Siddharth, OK, grazie per questo, aggiornerò la mia risposta ora – gyamana

0

L'installazione predefinita di LocationSource non deve necessariamente utilizzare il GPS per restituire posizioni precise.

Se rimuovo il permesso "ACCESS_FINE_LOCATION" nel file manifesto, non appena provo a visualizzare la mappa, l'applicazione si blocca

Questo perché l'implementazione predefinita utilizza LocationClient con LocationRequest.PRIORITY_HIGH_ACCURACY.

GoogleMap.setMyLocationEnabled quando si richiede solo l'autorizzazione ACCESS_COARSE_LOCATION, ma passa a LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY.

Vai a questa Android: Google Maps location with low battery usage

0

Per tutti gli altri avendo un errore con la risposta di gyamana a Manifest.permission. ACCESS_FINE_LOCATION errore. Assicurati di utilizzare Android.Manifest invece di my.app.package.Manifest.

2

Estratto dalla documentazione di Google. Sembra che la risposta più accettata su questo thread manchi di alcune informazioni critiche sulla chiamata di async checkSelfPermission.

Conferma. In caso contrario, cancellerò questa risposta.

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
       Manifest.permission.READ_CONTACTS) 
     != PackageManager.PERMISSION_GRANTED) { 

    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
      Manifest.permission.READ_CONTACTS)) { 

     // Show an expanation to the user *asynchronously* -- don't block 
     // this thread waiting for the user's response! After the user 
     // sees the explanation, try again to request the permission. 

    } else { 

     // No explanation needed, we can request the permission. 

     ActivityCompat.requestPermissions(thisActivity, 
       new String[]{Manifest.permission.READ_CONTACTS}, 
       MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

     // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
     String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
+0

Come si può richiedere il permesso dal servizio? – ajay