So fordern Sie Berechtigungen von einem Dienst in Android Marshmallow an

In Android Marshmallow sollten Berechtigungen zur Laufzeit angefordert werden, wenn sie benötigt werden, und nicht alle gleichzeitig, wenn eine App installiert wird. Ich kann jedoch anscheinend nur Berechtigungen von einer Aktivität anfordern, was ein Problem ist, da meine App nur Dienste enthält. (Warum fragen Sie das? Die App verfügt über ein Android Wear-Ziffernblatt, das darin enthalten ist. Das Telefon sucht nach Fotos in der Nähe, um sie an die Uhr zu senden. Es sind keine Aktivitäten erforderlich. Dafür sind jedoch Standortberechtigungen erforderlich.)

Gibt es eine Möglichkeit, Berechtigungen von einem Dienst anzufordern? Oder erzwingen Sie die Erzwingung der Berechtigungen zum Zeitpunkt der Installation wie in der Vergangenheit?

requestPermission() kann nur von einer Activity und nicht von einem Service checkPermission() Gegensatz zu checkPermission() , die nur PackageManager benötigt). Du musst also etwas zusätzliche Arbeit machen, um das zu umgehen. Sie müssen eine Activity in Ihrer App bereitstellen, und beispielsweise kann Ihr Service prüfen, ob er Berechtigungen benötigt. Wenn er noch nicht erteilt wurde, kann er eine Benachrichtigung erstellen und den Benutzer mit einer kurzen Beschreibung darüber informieren, warum Es gibt eine Benachrichtigung und was passiert, wenn sie auf die Benachrichtigung usw. klicken.

Ich stimme zu, das ist sehr lästig für Dienste, ich denke, Sie sollten ein Problem auf der Android Developer Preview-Seite dafür melden.

Im Moment denke ich, dass die beste Lösung ist, nach einer Erlaubnis für den Dienst zu suchen und eine Benachrichtigung zu zeigen, wenn die Erlaubnis fehlt. Noch besser: Erstellen Sie eine DialogActivity, um eine Berechtigung anzufordern, wenn Benutzer auf die Benachrichtigung drücken.

Sehen Sie sich die PermissionEverywhere- Bibliothek an. Es erlaubt Ihnen, Erlaubnis von irgendeinem Kontext anzufordern.

Es erstellt eine Benachrichtigung, mit der auf eine Aktivität geklickt wird, in der um Erlaubnis gefragt wird.

Beispielcode aus der Github-Seite der Bibliothek: –

 @Override protected Boolean doInBackground(Void... params) { PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQ_CODE, "Notification title", "This app needs a write permission", R.mipmap.ic_launcher) .call(); //waits.. boolean isGranted = response.isGranted(); if(isGranted){ //changed from isGrante to isGranted // Do stuff } } 

Es gibt eine sehr einfache Bibliothek, die genau das ermöglicht. Sie können unabhängig davon, ob sich die App im Vordergrund oder im Hintergrund befindet, nach Berechtigungen von überall (auch von einem Dienst) suchen. Entweder wird das normale Dialogfeld angezeigt oder es wird eine Benachrichtigung generiert, in der nach Berechtigungen gefragt wird. Der Code ist wirklich einfach zu verstehen und es ist auch sehr einfach zu benutzen.

Probieren Sie es aus: Android-Berechtigungen

 @SuppressLint("NewApi") public void checkPerm() { locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); if ( checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) { return; } locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {....} } 

Sie können ResultReceiver , um einen Empfänger der Antwort des Benutzers zu erstellen, und ihn dann als Callback an die Aktivität über den PendingIntent Benachrichtigung PendingIntent . Referenz