2015-10-11 12 views
13
java.lang.SecurityException: Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations. 

Aplikacja działa dobrze dla wersji Android 5 (Lollipop), ale robi wyjątek zabezpieczeń na Androida w wersji 6.Bezpieczeństwo Wyjątek tylko na Androida 6

Odpowiedz

9

Na swojej aktywności:

private static final int REQUEST_FINE_LOCATION=0 
... 
loadPermissions(Manifest.permission.ACCESS_FINE_LOCATION,REQUEST_FINE_LOCATION); 

Realizacja:

private void loadPermissions(String perm,int requestCode) { 
    if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED) { 
     if (!ActivityCompat.shouldShowRequestPermissionRationale(this, perm)) { 
      ActivityCompat.requestPermissions(this, new String[]{perm},requestCode); 
     } 
    } 
} 

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

    } 

} 
+1

W funkcji 'loadPermissions()', nie powinno istnieć 'else' klauzula (gdy' checkSelfPermission() 'zwraca' PackageManager.PERMISSION_GRANTED' gdzie robisz swoje rzeczy zgodne z prawami? 'OnRequestPermissionsResult()' zostanie wywołany tylko po wywołaniu 'requestPermissions()', więc w przypadku, gdy opisałem, nic się nie stanie –

+0

Jest tylko główną ideą przykładem, może w niektórych sytuacjach masz napisać implementację "else". – Hpsaturn

16

To dlatego, że te uprawnienia są niebezpieczne zezwolenie zgodnie z nowym pozwoleniem model Androida 6.0.

niebezpieczne pozwolenia muszą być wymagane w czasie wykonywania i powinny być sprawdzane za każdym razem przed użyciem.

będziesz musiał zmienić swoją implementację na adapt new permission model.

+1

Zazwyczaj to właśnie powinno być konieczne, jeśli jesteś kierowania API 23+. Jednak natrafiliśmy też na tego rodzaju wyjątki w systemie Android 6. Przypuszczam, że w implementacji awaryjnej systemu Android wystąpił błąd. – ubuntudroid

Powiązane problemy