2015-09-22 18 views
8

Sto usando Android Studio e compileSdkVersion è di 23 in che sto usando qui sotto il codiceLocation Manager rimuovere gli aggiornamenti permesso

if(locationManager != null){ 
      locationManager.removeUpdates(GPSListener.this); 
     } 

per fermare aggiornamento gps dove Listener GPS è una classe che implementa LocationListener.

ma in linea removeUpdates sto ottenendo qui sotto avvertimento pelucchi

chiamata richiede l'autorizzazione che può essere rifiutata dall'utente: codice dovrebbe controllare in modo esplicito per vedere se il permesso è disponibile (con checkPermission) o gestire un potenziale SecurityException

Non riesco a ottenere qual è il problema nel codice precedente. Qualsiasi autorizzazione aggiuntiva deve essere aggiunta nel file manifest ?.

Saluti.

+1

https://developer.android.com/preview/features/runtime-permissions.html – Kuffs

risposta

26

A partire dall'SDK 23, è necessario/necessario verificare l'autorizzazione prima di chiamare la funzionalità API di posizione. Ecco un esempio di come farlo:

if (locationManager != null) { 
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
      || checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
     locationManager.removeUpdates(GPSListener.this); 
    } 
} 

C'è checkSelfPermission(), che è quello di verificare se 'tu' (questa applicazione) ha le autorizzazioni corrette. C'è anche checkPermission(), che serve per verificare se un altro processo ha le autorizzazioni corrette.

Note

  • prossimo a fare questo controllo runtime, è ancora necessario anche richiedere i permessi rilevanti nel AndroidManifest.
  • se il targetSdk è < 23, è necessario utilizzare ContextCompat.checkSelfPermission() invece (grazie a JerryBrady)
+0

Grazie Tim. Ha risolto il mio problema. –

+8

Nota che se il tuo target è <23, dovresti usare ContextCompat.checkSelfPermission(). –

+0

Voglio piangere. Perché l'app deve disporre dell'autorizzazione per rimuovere un locallistener già associato dal responsabile della posizione? –

14

non ero in grado di utilizzare checkSelfPermission(), perché la mia min API è 14 ed è necessario 23. Sapendo questo, puoi anche try a catch a SecurityException.

Esempio:

try { 
    locationManager.removeUpdates(GPSListener.this); 
} catch (SecurityException e) { 
    Log.e("PERMISSION_EXCEPTION","PERMISSION_NOT_GRANTED"); 
} 
+0

La domanda è per la versione di sdk di destinazione 23. Non esiste alcuna relazione con min api. –

+2

La domanda era per "compileSdkVersion 23" che non significa che l'app ha come target 23. Se si desidera la compatibilità con le versioni precedenti con il supporto Android M completo, utilizzare ContextCompat.checkSelfPermission() e funzionerà. –

+1

Mi dispiace. Non me ne sono reso conto. Ma penso che questa opzione usando try - catch sia ancora utile. –

5

Per aggiungere al commento di Jerry Brady riguardo ContextCompat, questo è essere il codice completo per < 23:

if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
       || ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
-1

Ecco la mia soluzione!

if (Build.VERSION.SDK_INT >= 23) { 

       if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
         || checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 

        lm.removeUpdates(this); 
       } 
      } 
      else 
      { 
       lm.removeUpdates(this); 

      }