2015-08-26 11 views
22

Ho un errore strano durante l'utilizzo dell'emulatore SOLO. Ho trovato una domanda che ha lo stesso problema 9 mesi fa senza risposte ...ACCESS_FINE_LOCATION emulatore di errore di autorizzazione solo

Sto utilizzando i servizi di Google Play location per ottenere posizioni nella mia app e sono sicuro delle mie autorizzazioni manifest e di tutto funziona perfettamente sul mio telefono, il problema si verifica quando si utilizza un emulatore solo, e ho provato diversi emulatori su entrambi i miei computer iMac e Windows.

Dubito che gli emulatori non supportino questa funzione di base!

Ecco il mio codice manifesto:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.orderme.ordermeandroid" > 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

e qui è dove l'eccezione è sparare:

LocationRequest mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(10000); 
    mLocationRequest.setFastestInterval(5000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,mLocationRequest,this); 

dello stack trace:

08-26 14:01:19.699 10157-10157/com.orderme.ordermeandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.orderme.ordermeandroid, PID: 10157 
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.zzg$zza$zza.zza(Unknown Source) 
     at com.google.android.gms.location.internal.zzi.zza(Unknown Source) 
     at com.google.android.gms.location.internal.zzj.zza(Unknown Source) 
     at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source) 
     at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source) 
     at com.google.android.gms.common.api.zzc$zza.zzb(Unknown Source) 
     at com.google.android.gms.common.api.zzf.zza(Unknown Source) 
     at com.google.android.gms.common.api.zzf.zzb(Unknown Source) 
     at com.google.android.gms.common.api.zzi.zzb(Unknown Source) 
     at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source) 
     at com.orderme.ordermeandroid.Main.MainActivity.onConnected(MainActivity.java:184) 
     at com.google.android.gms.common.internal.zzk.zzh(Unknown Source) 
     at com.google.android.gms.common.api.zzg.zznt(Unknown Source) 
     at com.google.android.gms.common.api.zzg.onConnected(Unknown Source) 
     at com.google.android.gms.common.api.zzi$2.onConnected(Unknown Source) 
     at com.google.android.gms.common.internal.zzj$zzg.zzoD(Unknown Source) 
     at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source) 
     at com.google.android.gms.common.internal.zzj$zza.zzs(Unknown Source) 
     at com.google.android.gms.common.internal.zzj$zzc.zzoF(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) 
+0

Ho anche ottenuto questo errore su emulatore, avete testato in un dispositivo Si stava lavorando bene quando l'ho testato su un dispositivo reale !! –

+0

Gli emulatori non hanno installato i servizi di google play, li installano e vedono se si ottiene di nuovo lo stesso errore – penta

+0

grazie per il commento, ma lo snippet di codice nel post è preso dal metodo onConnected del googleapiclient, il che significa che tutto prima funziona e si sta anche connettendo, inoltre, se i servizi non sono disponibili, dovrei ottenere un errore nell'usare le classi e non il permesso! –

risposta

37

La mia ipotesi è che si sta eseguendo su un emulatore Android 6.0+ e si dispone di un targetSdkVersion di 23 o superiore.

In tal caso, ACCESS_COARSE_LOCATION e ACCESS_FINE_LOCATION fanno parte di the Android 6.0 runtime permission system. O rivedere la vostra applicazione per partecipare a questo sistema, o far cadere il vostro targetSdkVersion sotto 23.

+0

grazie! questo è stato, anche se odiavo il nuovo metodo di permessi ma ha risolto il problema –

+0

Ho aggiornato il mio telefono il giorno prima di una demo e ho iniziato a dare di matto per questo. Grazie, mi hai salvato. – jirungaray

+0

Sono nuovo nello sviluppo di Android. Riesaminerai la tua risposta per rispondere alla domanda "O rivedi la tua app per partecipare a questo sistema o rilascia la tua TargetSdkVersion sotto 23."? Grazie. – Sung

4

Non si può ottenere la posizione corrente dall'emulatore. Ma puoi emularlo per testare il tuo codice. Here puoi trovare come emulare.

Edit1: C'è una nota here

Nota: Se si utilizza sia NETWORK_PROVIDER e GPS_PROVIDER, allora avete bisogno di richiedere solo l'autorizzazione ACCESS_FINE_LOCATION, perché include il permesso per entrambi i fornitori. (L'autorizzazione per ACCESS_COARSE_LOCATION include l'autorizzazione solo per NETWORK_PROVIDER.)

È necessario utilizzare solo l'autorizzazione ACCESS_FINE_LOCATION. Forse questo aiuta.

+0

L'ho provato prima, non l'ho risolto, non mi importa trovare le posizioni nulle che sto gestendo, l'errore come potete vedere è dal PERMISSION, –

+0

ho aggiornato la mia risposta – kgnkbyl

+0

sì ho provato anche questo _ ^, Penso che la risposta di commonsWare sia quella che sto provando ora –

15

in Android 6.0 (API di livello 23), gli utenti concedono autorizzazioni per le applicazioni mentre l'applicazione è in esecuzione, non quando si installa l'applicazione

Come verificare se si ha il permesso:

// Assume thisActivity is the current activity 
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, 
     android.Manifest.permission.ACCESS_FINE_LOCATION); 

Come richiedere i permessi necessari:

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

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

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

Come accedere al risultato della richiesta:

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
switch (requestCode) { 
    case MY_PERMISSIONS_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 task you need to do. 

     } else { 

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

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

Ulteriori informazioni sulle autorizzazioni: https://guides.codepath.com/android/Understanding-App-Permissions

1

Il problema è stato causato da una nuova funzionalità per Android 6.0. spero che il suo lavoro ...

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.

0
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

alcune volte manifest ha una riga mancante che concede l'autorizzazione di ACCESS_FINE_LOCATION. quindi devi menzionarlo nel manifest.

Ho fatto questo e il mio problema è stato risolto.

Questo in genere accade perché abbiamo dato il permesso nel manifest così l'app creerebbe un problema in quanto non sarebbe stato permesso di accedere alle autorizzazioni e il file si sarebbe bloccato.

<?xml version="1.0" encoding="utf-8"?> 


<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" > 
    <activity android:name=".MainActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

Problemi correlati