So fordern Sie Berechtigungen von einem Dienst in Android Marshmallow an

101

In Android Marshmallow sollten Berechtigungen zur Laufzeit angefordert werden, wenn sie benötigt werden, und nicht alle auf einmal, wenn eine App installiert wird. Ich kann jedoch scheinbar nur Berechtigungen von einer Aktivität anfordern, was ein Problem darstellt, da meine App nur Dienste enthält. (Warum ist das so, fragen Sie sich vielleicht? In der App ist ein Android Wear-Zifferblatt gebündelt, und das Telefon sucht nur nach Fotos in der Nähe, um sie an die Uhr zu senden - keine Aktivität erforderlich. Es sind jedoch Standortberechtigungen erforderlich.)

Gibt es eine Möglichkeit, Berechtigungen von einem Dienst anzufordern? Oder irgendwie erzwingen, dass die Berechtigungen zur Installationszeit wie in der Vergangenheit erteilt werden?

Tony Wickham
quelle
Dieses Problem auch innerhalb der Anwendungsklasse
Itzhar
Versuchen Sie dies, es kann Arbeit Stackoverflow.com/a/41221852/5488468
Bipin Bharti
Meine Bibliothek verwaltet Laufzeitberechtigungen einfach aus jedem Kontext und behandelt auch "Nicht erneut fragen". github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Antworten:

47

requestPermission()kann nur von einem Activityund nicht von einem aufgerufen werden Service(im Gegensatz dazu checkPermission()erfordert dies nur PackageManager). Sie müssen also zusätzliche Arbeit leisten, um dies zu umgehen. Sie müssen Activityin Ihrer App eine angeben, und Sie Servicekönnen beispielsweise nach erforderlichen Berechtigungen suchen. Wenn diese noch nicht erteilt wurden, kann eine Benachrichtigung erstellt werden, die den Benutzer mit einer beschreibenden Kurznachricht darüber informiert, warum dies der Fall ist eine Benachrichtigung und was muss passieren, wenn sie auf die Benachrichtigung klicken, usw.

Ali Naddaf
quelle
Dies ist die Lösung, die Benjamin Poiesz vorgeschlagen hat. Sie können diesen Podcast von 23:40
Xiaomi
Sie können auch requestPermission () innerhalb des Fragments aufrufen.
Misagh Emamverdi
3
Was ist die Lösung für den Fall, dass ein laufender Hintergrunddienst regelmäßig nach Standortaktualisierungen sucht und ich die Standortberechtigung in den Einstellungen einfach deaktiviere? Da es keine Aktivität gibt, stürzt mein Dienst ab, wenn ich die App
stud91
1
@ stud91 Erfassen Sie mindestens jedes Mal Sicherheitsausnahmen oder Abfrageberechtigungen, wenn Sie Standortaktualisierungen anfordern. Dadurch wird verhindert, dass Ihre App abstürzt (obwohl Sie keine Standorte erhalten, wenn die Berechtigung widerrufen wurde). Noch besser: Überprüfen Sie die Berechtigung und zeigen Sie, falls sie fehlt, eine Benachrichtigung an, die den Benutzer zu einer Aktivität führt, die nur ein Platzhalter für das Berechtigungsdialogfeld ist.
user149408
8
So habe ich es gelöst: github.com/mvglasow/satstat/blob/master/src/com/vonglasow/… Es kann von jedem aufgerufen werden, Contextder auch implementiert OnRequestPermissionsResultCallback. Die Funktionalität ist ähnlich wie beim Standard requestPermission().
user149408
15

Ich bin damit einverstanden, dass dies für Dienste sehr problematisch ist. Ich denke, Sie sollten hierfür ein Problem auf der Android Developer Preview-Seite melden.

Im Moment denke ich, dass die beste Lösung darin besteht, die Berechtigung für den Dienst zu überprüfen und eine Benachrichtigung anzuzeigen, wenn die Berechtigung fehlt. Erstellen Sie noch besser eine DialogActivity, um eine Berechtigung anzufordern, wenn Benutzer auf die Benachrichtigung klicken.

Derek Fung
quelle
7

Schauen Sie sich PermissionEverywhere an Bibliothek an. Sie können die Berechtigung in jedem Kontext anfordern.

Es wird ein Benachrichtigungsklick erstellt, auf den eine Aktivität geöffnet wird, in der um eine Erlaubnis gebeten wird.

Beispielcode von 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
      }
  }
Heisenberg
quelle
1
Ich habe eine asynchrone Version in einem Dienst ausprobiert und es hat nicht funktioniert. onComplete wurde nie angerufen
Leo Droidcoder
Gute Idee, aber es ist nicht im Repository verfügbar
naXa
2
Dieses Paket hat bei mir funktioniert, danke für den Vorschlag. Ich würde jedoch bemerken, dass ich die asynchrone Version nicht ausprobiert habe. PermissionEverywhereWenn Sie Probleme mit der Verwendung haben , stellen Sie außerdem sicher, dass Sie die Hilfsaktivität in Ihrem Manifest deklarieren UND dass sie bei der Deklaration an das richtige Paket gebunden ist (wenn Sie sie PermissionEverywhereals separates Paket verwenden). Es hat lange gedauert, bis mir klar wurde, dass ich das PermissionEverywherePaket im Manifest nicht spezifiziert habe .
Benutzer3570982
Ich habe die PermissionEverywhereDemo-App ausgeführt und es hat nicht funktioniert.
Ixx
2

Es gibt eine sehr einfache Bibliothek, die genau dies ermöglicht. Sie können von überall (auch von einem Dienst) nach Berechtigungen suchen, je nachdem, ob sich die App im Vordergrund oder im Hintergrund befindet. Sie zeigt entweder den normalen Dialog an oder generiert eine Benachrichtigung, in der Sie nach Berechtigungen gefragt werden. Der Code ist sehr einfach zu verstehen und auch sehr einfach zu verwenden.

Probieren Sie es aus: Android-Berechtigungen

Nishkarsh
quelle
-2

Sie können ResultReceivereinen Empfänger für die Antwort des Benutzers erstellen und ihn dann über Benachrichtigungen als Rückruf an die Aktivität weiterleiten PendingIntent. Referenz

Farrux Bahodirov
quelle