2015-09-22 18 views
8

Używam android studio i compileSdkVersion jest 23 że używam poniżej kodLokalizacja Menedżer usunąć aktualizacji pozwolenia

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

zatrzymać aktualizację gps gdzie Listener GPS to klasa, która implementuje LocationListener.

ale zgodne removeUpdates otrzymuję poniżej ostrzeżenia niestrzępiącą

połączeń wymaga uprawnień, które mogą zostać odrzucone przez użytkownika: kod powinien jednoznacznie sprawdzić, czy zezwolenie jest dostępny (z checkPermission) lub uchwyt potencjał SecurityException

Nie otrzymuję problemu z powyższym kodem. Jakiekolwiek dodatkowe uprawnienia należy dodać do pliku manifestu ?.

Pozdrawiam.

+1

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

Odpowiedz

26

Od wersji SDK 23 powinieneś/musisz sprawdzić uprawnienie przed wywołaniem funkcji API lokalizacji. Oto przykład jak to zrobić:

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

Jest checkSelfPermission(), która ma sprawdzić, czy „ty” (ta aplikacja) ma odpowiednie uprawnienia. Istnieje również checkPermission(), który polega na sprawdzeniu, czy inny proces ma odpowiednie uprawnienia.

Uwagi

  • obok robi to sprawdzanie wykonania, wciąż jest również konieczne, aby wymagać odpowiednich uprawnień w AndroidManifest.
  • jeśli targetSdk jest < 23, należy użyć ContextCompat.checkSelfPermission() zamiast (dzięki JerryBrady)
+0

Dzięki Tim. To rozwiązało mój problem. –

+8

Pamiętaj, że jeśli Twój cel jest <23, powinieneś użyć ContextCompat.checkSelfPermission(). –

+0

Chcę płakać. Dlaczego aplikacja potrzebuje pozwolenia na usunięcie już dołączonej listy lokalizacji od menedżera lokalizacji? –

14

I nie był w stanie wykorzystać checkSelfPermission(), ponieważ mój min API jest 14 i 23 jest wymagana. Wiedząc o tym, możesz również try do catch a SecurityException.

Przykład:

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

Pytanie dotyczy docelowej wersji sdk 23. Brak powiązania z min. Api. –

+2

Pytanie dotyczyło "compileSdkVersion 23", co nie oznacza, że ​​aplikacja jest kierowana na 23. Jeśli chcesz kompatybilność wsteczną z pełną obsługą Android M, użyj zamiast tego opcji ContextCompat.checkSelfPermission() i to zadziała. –

+1

Przepraszam. Nie zdawałem sobie z tego sprawy. Ale myślę, że ta opcja przy użyciu try-catch nadal jest przydatna. –

5

Aby dodać komentarz Jerry Brady'ego dotyczących ContextCompat, to być pełny kod dla < 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

Oto moje rozwiązanie!

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

      } 
Powiązane problemy