Ich habe das offizielle Dokument über das neue Berechtigungsmodell in Android M durchgesehen. Es handelt von der shouldShowRequestPermissionRationale()
Funktion, die zurückgegeben wird, true
wenn die App diese Berechtigung zuvor angefordert hat und der Benutzer die Anforderung abgelehnt hat. Wenn der Benutzer die Berechtigungsanforderung in der Vergangenheit abgelehnt und die Option Nicht erneut fragen ausgewählt hat, wird diese Methode zurückgegeben false
.
Aber wie können wir zwischen den folgenden beiden Fällen unterscheiden?
Fall 1 : Die App hat keine Berechtigung und der Benutzer wurde zuvor nicht nach der Berechtigung gefragt. In diesem Fall gibt shouldShowRequestPermissionRationale () false zurück, da dies das erste Mal ist, dass wir den Benutzer fragen.
Fall 2 : Der Benutzer hat die Berechtigung verweigert und "Nicht erneut fragen" ausgewählt. Auch in diesem Fall sollte shouldShowRequestPermissionRationale () false zurückgeben.
Ich möchte den Benutzer in Fall 2 zur Einstellungsseite der App senden. Wie unterscheide ich diese beiden Fälle?
quelle
shouldShowRequestPermissionRationale()
in diesem Fall, dass die Rückgabe falsch ist, was jeden Code verletzt, der auf dem Flag "Habe ich vorher gefragt" basiert.permissions
für Android zeigt. github.com/android/permissions-samplesAntworten:
Wenn nach M Vorschau 1 der Dialog zum ersten Mal angezeigt wird , gibt es kein Kontrollkästchen Nie wieder fragen .
Wenn der Benutzer die Berechtigungsanforderung ablehnt, wird im Berechtigungsdialog beim zweiten Anfordern der Berechtigung das Kontrollkästchen Nie wieder fragen angezeigt .
Die Logik sollte also so aussehen:
Um Erlaubnis bitten:
Überprüfen Sie, ob die Berechtigung in verweigert oder erteilt wurde
onRequestPermissionsResult
.Wenn die Berechtigung zuvor verweigert wurde, wird dieses Mal im Berechtigungsdialog das Kontrollkästchen Nie wieder fragen angezeigt.
Rufen Sie
shouldShowRequestPermissionRationale
an, um zu sehen, ob der Benutzer die Option Nie wieder fragen aktiviert hat .shouldShowRequestPermissionRationale
Die Methode gibt nur dann false zurück, wenn der ausgewählte Benutzer Nie wieder fragen oder die Geräterichtlinie der App diese Berechtigung untersagt:Sie müssen also nicht nachverfolgen, ob ein Benutzer die Option Nie wieder fragen oder nicht aktiviert hat .
quelle
context
inActivityCompat.shouldShowRequestPermissionRationale(...)
dem Parameter tatsächlich vom Typ istActivity
. Kann Sie nicht alle betreffen, aber in meinem Fall tut es.should
den Rückruf aufzurufen UND seinen Zählerwert in NVM zu speichern, um zu wissen, ob ich die Anfrage beim nächsten Öffnen der App erneut auffordern muss! ... wow (facepalm) ... war es zu schwierig, nur einen Anruf zu tätigen, der eine Statusaufzählung zurückgibt?Ich hatte das gleiche Problem und habe es herausgefunden. Um das Leben viel einfacher zu machen, habe ich eine util-Klasse geschrieben, um Laufzeitberechtigungen zu verarbeiten.
Die PreferenceUtil- Methoden lauten wie folgt.
Jetzt müssen Sie nur noch die Methode checkPermission mit den richtigen Argumenten verwenden.
Hier ist ein Beispiel,
Sie erhalten einen Rückruf für onPermissionAsk für Fall 1 und onPermissionDisabled für Fall 2.
Viel Spaß beim Codieren :)
quelle
public void onPermissionAsk() { ActivityCompat.requestPermissions( thisActivity, ...
.thisActivity
ist nichts anderes alsYourActivity.this
.context
Sie?shouldShowRequestPermissionRationale(permission)
existiert nicht inandroid.content.Context
. es ist in ActivityCompatAKTUALISIEREN
Ich glaube, dass die Antwort von CanC unten die richtige ist, die befolgt werden sollte. Die einzige Möglichkeit, dies sicher zu wissen, besteht darin, dies im Rückruf onRequestPermissionResult mithilfe von shouldShowPermissionRationale zu überprüfen.
==
Meine ursprüngliche Antwort:
Die einzige Möglichkeit, die ich gefunden habe, besteht darin, selbst zu verfolgen, ob dies das erste Mal ist oder nicht (z. B. mithilfe gemeinsamer Einstellungen). Wenn es nicht das erste Mal ist, verwenden Sie
shouldShowRequestPermissionRationale()
zur Unterscheidung.Siehe auch: Android M - Laufzeitberechtigung prüfen - Wie kann festgestellt werden, ob der Benutzer "Nie wieder fragen" aktiviert hat?
quelle
So wie ich es verstehe, sollte shouldShowRequestPermissionRationale () eine Reihe von Anwendungsfällen unter der Haube ausführen und die App benachrichtigen, ob eine Erklärung zu den angeforderten Berechtigungen angezeigt werden soll oder nicht.
Die Idee hinter den Laufzeitberechtigungen ist, dass der Benutzer die Berechtigungsanforderung meistens mit Ja beantwortet. Auf diese Weise muss der Benutzer nur einen Klick ausführen. Natürlich sollte die Anfrage im richtigen Kontext verwendet werden - dh nach der Erlaubnis der Kamera fragen, wenn die Schaltfläche "Kamera" gedrückt wird.
Wenn der Benutzer die Anforderung ablehnt, aber nach einiger Zeit erneut auf die Schaltfläche "Kamera" drückt, gibt shouldShowRequestPermissionRationale () true zurück, sodass die App eine aussagekräftige Erklärung dafür anzeigen kann, warum die Berechtigung angefordert wird und warum die App dies nicht tut ohne es richtig arbeiten. Normalerweise zeigen Sie in diesem Dialogfenster eine Schaltfläche zum erneuten Verweigern / späteren Entscheiden und eine Schaltfläche zum Erteilen der Berechtigungen. Die Schaltfläche zum Erteilen von Berechtigungen im Begründungsdialog sollte die Berechtigungsanforderung erneut starten. Diesmal hat der Benutzer auch das Kontrollkästchen "Nie wieder anzeigen". Sollte er sich entscheiden, es auszuwählen und die Berechtigung erneut zu verweigern, würde dies das Android-System benachrichtigen, dass sich der Benutzer und die App nicht auf derselben Seite befinden. Diese Aktion hätte zwei Konsequenzen: Sollte ShowRequestPermissionRationale () immer false zurückgeben,
Es gibt aber auch ein anderes mögliches Szenario, in dem onRequestPermissionsResult verwendet werden könnte. Beispielsweise verfügen einige Geräte möglicherweise über eine Geräterichtlinie, die die Kamera deaktiviert (für CIA, DARPA usw.). Auf diesen Geräten gibt onRequestPermissionsResult immer false zurück, und die requestPermissions () -Methode lehnt die Anforderung stillschweigend ab.
Das habe ich beim Anhören des Podcasts mit Ben Poiesz - einem Produktmanager im Android-Framework - gesammelt.
http://androidbackstage.blogspot.jp/2015/08/episode-33-permission-mission.html
quelle
Posten Sie einfach eine andere Option, wenn jemand Lust dazu hat. Sie können EasyPermissions, die von Google selbst bereitgestellt wurden, verwenden, um "die Berechtigungen für Android M-Systeme zu vereinfachen".
Dann müssen Sie nicht
shouldShowRequestPermissionRationale
direkt damit umgehen .quelle
permissionPermanentlyDenied
Internes Fragen ruft nur anshouldShowPermissionsRationale
und kehrttrue
zurück, wenn der Benutzer nie aufgefordert wurde, Berechtigungen zu erteilen.Wenn jemand an einer Kotlin-Lösung interessiert ist, habe ich die @ muthuraj-Antwort überarbeitet, um in Kotlin zu sein. Außerdem wurde es ein wenig modernisiert, einen Vervollständigungsblock anstelle von Zuhörern zu haben.
PermissionUtil
PermissionHandler
Implementierung
quelle
Überprüfen Sie diese Implementierung. arbeitet ziemlich gut für mich. Grundsätzlich überprüfen Sie die Berechtigungen in der Methode checkPermissions (), indem Sie eine Liste von Berechtigungen übergeben. Sie überprüfen das Ergebnis der Berechtigungsanforderung auf onRequestPermissionsResult (). Mit der Implementierung können Sie beide Fälle behandeln, wenn der Benutzer "Nie wieder fragen" auswählt oder nicht. In dieser Implementierung hat der Dialog die Option, ihn zur Aktivität "App-Einstellungen" zu führen, falls se "Nie wieder fragen" auswählt.
Der ganze Code befindet sich in meinem Fragment. Ich dachte, es wäre besser, eine spezielle Klasse dafür zu erstellen, wie einen PermissionManager, aber ich bin mir nicht sicher.
quelle
Kann für jemanden nützlich sein: -
Was mir aufgefallen ist, ist, dass beim Aktivieren des Flags shouldShowRequestPermissionRationale () in der Rückrufmethode onRequestPermissionsResult () nur zwei Zustände angezeigt werden.
Status 1: -Return true: - Jedes Mal, wenn der Benutzer auf Verweigern von Berechtigungen klickt (einschließlich des ersten Males).
Status 2: - Gibt false zurück: - Wenn der Benutzer "Nie wieder fragen" auswählt.
Link für detailliertes Arbeitsbeispiel .
quelle
Können wir das so machen?
quelle
shouldShowRequestPermissionRationale
Für die SPECIAL-Berechtigung wird immer NUR TRUE zurückgegeben, nachdem der Benutzer dies ohne Kontrollkästchen verweigert hatWir sind an FALSE Wert interessiert
Es gehen also 3 Fälle mit falschem Wert verloren:
1. Bisher gab es keine solche Aktion, und jetzt entscheidet sich der Benutzer, zuzustimmen oder abzulehnen.
Einfach eine Präferenz definieren ,
ASKED_PERMISSION_*
die jetzt nicht mehr existiert und wäre wahr inonRequestPermissionsResult
auf es auf jeden Fall starten ist von zustimmen oder ablehnenObwohl diese Einstellung nicht vorhanden ist, gibt es keinen Grund, dies zu überprüfen
shouldShowRequestPermissionRationale
2. Benutzer klickte auf zustimmen.
Einfach machen:
Was true zurückgibt und es keinen Grund gibt, dies zu überprüfen
shouldShowRequestPermissionRationale
3. Der Benutzer hat mit dem Kontrollkästchen Verweigern geklickt (zweite oder längere Zeit gefragt).
Es ist DIE ZEIT zu arbeiten, mit
shouldShowRequestPermissionRationale
der FALSE zurückgegeben wird(Präferenz besteht und wir haben keine Erlaubnis)
quelle
Dieser Code fordert den Benutzer auf, zur Laufzeit um Erlaubnis zu bitten. Wenn der Benutzer dies zulässt, führt er die Ergebnismethode aus. Wenn der Benutzer dies verweigert, fragt er erneut mit der Beschreibung mit dem Benutzer verweigern (er fragt erneut mit Anweisungen), aber wenn der Benutzer wählt, fragen Sie nie wieder. es behandelt nie wieder fragen, zeigt offene Einstellungsoption mit Anweisungen an.
quelle