2015-11-23 5 views
32

Ich verwende einen Dienst, der beim Start startet und nach Standortaktualisierungen sucht. Sobald ich den Zugriff auf die Adresse per Permission verweigert habe, kann mein Dienst dank Android M abstürzen, sobald das Telefon hochgefahren ist.Anforderung von Standortberechtigungen von einem Dienst Android M

Da ich in diesem Fall keine Aktivität habe, gibt der Anruf an requestPermissions() eine ClassCastException zurück, da mein Dienst Context nicht in eine Aktivität umgewandelt werden kann.

Mein Methodenaufruf:

ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION); 

Gibt es eine Lösung bisher zu dieser oder muss ich die Service-Rechte widerrufen nicht in einem solchen Zustand ausgeführt werden.

+1

In Service, den Sie ** ContextCompat.checkSelfPermission() verwenden können ** Erlaubnis Verfügbarkeit überprüfen bevor Sie etwas arbeiten. –

+0

@Dhaval Patel Ja, das Problem liegt in Anforderungsberechtigungen in einem Dienst. Scheint, es gibt keine Möglichkeit, dies noch ohne eine Aktivität zu tun – stud91

+3

möglicherweise können Sie feuern Benachrichtigung, Benutzer zu fragen, um die Erlaubnis zu geben. –

Antwort

40

Sie können keine Berechtigung über einen Dienst anfordern, da ein Dienst nicht an eine Benutzeroberfläche gebunden ist. Dies ist sinnvoll. Da ein Service-Kontext keine Aktivität ist, macht die Ausnahme, die Sie erhalten, Sinn.

Sie können überprüfen, ob die Berechtigung in einem Dienst verfügbar ist, und die Berechtigung in einer Aktivität anfordern (ja, Sie benötigen eine Aktivität).

In einem Service:

public static boolean checkPermission(final Context context) { 
return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
     && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; 
} 

und in einer Aktivität:

private void showPermissionDialog() { 
    if (!LocationController.checkPermission(this)) { 
     ActivityCompat.requestPermissions(
      this, 
      new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 
      PERMISSION_LOCATION_REQUEST_CODE); 
    } 
} 
+4

@VitaliyA Der Dienst kann auf Berechtigung prüfen, aber nicht anfordern, weil es keine Benutzeroberfläche hat. – geNia

+0

Sie haben Recht, meine Antwort ist nicht complite. –

+2

Wenn Sie Manifest.permission.ACCESS_COARSE_LOCATION oder Fine location nicht auflösen können Android-Präfix ... wie folgt verwenden: android.Manifest.permission.ACCESS_COARSE_LOCATION – Bartando

9

Sie Berechtigungen ohne Aktivität mithilfe von Anwendungskontext überprüfen können, aber Sie werden Aktivität benötigen, wenn permitions anfordert. Um den App-Kontext aufzurufen, rufen Sie einfach getApplicationContext() an und überprüfen Sie die Berechtigungen, indem Sie stattdessen ContextCompat.checkSelfPermission() verwenden.

Auch gibt es gute Informationen wie Laufzeit-Berechtigungen in correct way verwenden:

Um zu überprüfen, ob Sie eine Berechtigung haben, die ContextCompat.checkSelfPermission() Methode aufrufen. Zum Beispiel dieser Ausschnitt zeigt, wie wenn man die Aktivität Erlaubnis zum Kalender zu schreiben hat zu überprüfen:

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

Wenn die App die Berechtigung hat, gibt die Methode PackageManager.PERMISSION_GRANTED, und die App mit dem Betrieb gehen . Wenn die App nicht über die Berechtigung verfügt, gibt die Methode PERMISSION_DENIED zurück, und die App muss den Benutzer explizit um die Berechtigung bitten.

Edit: Nachdem Sie die permitions auf Service überprüfen, müssen Sie die Aktivität permition beantragen:

public static void requestPermissions (Activity activity, String[] permissions, int requestCode) 
+0

Die Erklärung unter https://developer.android.com/training/permissions/requesting.html#java zeigt, wie die Anforderung von Berechtigungen zum Auslösen eines onRequestPermissionsResult-Handlers führt. Dies ist, was Sie abfangen müssen, um die Erlaubnisanforderung abzuschließen. – pollaris

Verwandte Themen