2015-09-22 4 views
8

Ich bin mit Android Studio und compileSdkVersion ist 23 , dass ich Code unten bin mitLocation Manager-Updates entfernen Erlaubnis

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

GPS-Update zu stoppen, wo GPS-Listener eine Klasse ist, die Location implementiert.

aber in removeUpdates Linie ich bin immer unter Flusen Warnung

Anruf erfordert die Erlaubnis, die vom Benutzer zurückgewiesen werden kann: Code sollte überprüfen, um ausdrücklich festzustellen, ob die Erlaubnis zur Verfügung (mit checkPermission) oder einem potenziellen Griff

Ich bekomme nicht, was das Problem in dem obigen Code ist. Zusätzliche Berechtigungen müssen in der Manifestdatei hinzugefügt werden.

Grüße.

+1

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

Antwort

26

Seit SDK 23 sollten/müssen Sie die Berechtigung prüfen, bevor Sie die Standort-API-Funktionalität aufrufen. Hier ist ein Beispiel dafür, wie es zu tun:

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); 
    } 
} 

Es gibt checkSelfPermission(), was zu prüfen ist, wenn ‚Sie‘ (diese app) die richtigen Berechtigungen verfügen. Es gibt auch checkPermission(), die prüfen soll, ob ein anderer Prozess die richtigen Berechtigungen hat.

Hinweise

  • diese Laufzeitüberprüfung neben tun, ist es noch notwendig, auch die entsprechenden Berechtigungen in der AndroidManifest zu verlangen.
  • wenn Ihr targetSdk < 23 ist, sollten Sie ContextCompat.checkSelfPermission() verwenden statt (dank JerryBrady)
+0

Dank Tim. Es hat mein Problem gelöst. –

+8

Wenn das Ziel <23 ist, sollten Sie stattdessen ContextCompat.checkSelfPermission() verwenden. –

+0

Ich möchte weinen. Warum benötigt die App eine Berechtigung, um einen bereits angehängten locationlistener vom Standortmanager zu entfernen? –

14

Ich war nicht in der Lage checkSelfPermission() zu verwenden, da meine min API 14 und 23 erforderlich ist. Wenn Sie das wissen, können Sie auch try bis catch eine SecurityException.

Beispiel:

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

Frage ist für die Ziel-SDK-Version 23. Es gibt keine Beziehung mit min api. –

+2

Die Frage lautete "compileSdkVersion 23", was nicht bedeutet, dass die App auf 23 ausgerichtet ist. Wenn Sie Rückwärtskompatibilität mit vollständiger Android M-Unterstützung möchten, verwenden Sie stattdessen ContextCompat.checkSelfPermission() und es wird funktionieren. –

+1

Es tut mir leid. Das habe ich nicht bemerkt. Aber ich denke, dass diese Option mit try - catch immer noch nützlich ist. –

5

Jerry Brady Kommentar bezüglich ContextCompat hinzuzufügen, ist dies für < 23 der vollständige Code sein:

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

Hier meine Lösung ist!

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); 

      }