Je parcourais la documentation officielle sur le nouveau modèle d'autorisations dans Android M. Il parle de la shouldShowRequestPermissionRationale()
fonction qui revient true
si l'application a demandé cette autorisation précédemment et que l'utilisateur a refusé la demande. Si l'utilisateur a refusé la demande d'autorisation dans le passé et a choisi l'option Ne plus demander, cette méthode retourne false
.
Mais comment différencier les deux cas suivants?
Cas 1 : l'application n'a pas d'autorisation et l'autorisation n'a pas été demandée à l'utilisateur auparavant. Dans ce cas, shouldShowRequestPermissionRationale () retournera false car c'est la première fois que nous demandons à l'utilisateur.
Cas 2 : l'utilisateur a refusé l'autorisation et a sélectionné "Ne plus demander", dans ce cas également shouldShowRequestPermissionRationale () retournera false.
Je voudrais envoyer l'utilisateur à la page des paramètres de l'application dans le cas 2. Comment différencier ces deux cas?
la source
shouldShowRequestPermissionRationale()
retour est faux dans ce cas, ce qui nuira à tout code reposant sur un indicateur "ai-je demandé avant".permissions
sur Android. github.com/android/permissions-samplesRéponses:
Après M Preview 1, si la boîte de dialogue s'affiche pour la première fois , il n'y a pas de case à cocher Ne plus demander .
Si l'utilisateur refuse la demande d'autorisation, il y aura une case à cocher Ne plus jamais demander dans la boîte de dialogue d'autorisation la deuxième fois que l' autorisation est demandée.
La logique devrait donc être comme ceci:
Demander la permission:
Vérifiez si l'autorisation a été refusée ou accordée dans
onRequestPermissionsResult
.Si l'autorisation a été refusée précédemment, cette fois, il y aura une case à cocher Ne plus jamais demander dans la boîte de dialogue d'autorisation.
Appelez
shouldShowRequestPermissionRationale
pour voir si l'utilisateur a coché Ne plus jamais demander .shouldShowRequestPermissionRationale
La méthode renvoie false uniquement si l'utilisateur a sélectionné Ne plus jamais demander ou si la stratégie de l'appareil interdit à l'application d'avoir cette autorisation:Ainsi, vous n'aurez pas à suivre si un utilisateur a coché Ne plus jamais demander ou non.
la source
context
dansActivityCompat.shouldShowRequestPermissionRationale(...)
le paramètre est en fait de typeActivity
. Peut ne pas vous affecter tous mais dans mon cas c'est le cas.should
dans le rappel ET à enregistrer sa contre-valeur dans NVM juste pour savoir si j'ai besoin de demander à nouveau la demande la prochaine fois que l'application s'ouvre! ... wow (facepalm) ... était-ce trop difficile de faire un seul appel retournant une énumération de statut ??J'ai eu le même problème et je l'ai compris. Pour simplifier la vie, j'ai écrit une classe util pour gérer les autorisations d'exécution.
Et les méthodes PreferenceUtil sont les suivantes.
Maintenant, tout ce dont vous avez besoin est d'utiliser la méthode checkPermission avec les arguments appropriés.
Voici un exemple,
Vous obtiendrez un rappel sur onPermissionAsk pour le cas 1 et onPermissionDisabled pour le cas 2.
Bon codage :)
la source
public void onPermissionAsk() { ActivityCompat.requestPermissions( thisActivity, ...
.thisActivity
n'est rien d'autre queYourActivity.this
.context
utilisez-vous?shouldShowRequestPermissionRationale(permission)
n'existe pas dansandroid.content.Context
. il est dans ActivityCompatMETTRE À JOUR
Je crois que la réponse de CanC ci-dessous est la bonne à suivre. Le seul moyen d'en être sûr est de le vérifier dans le rappel onRequestPermissionResult à l'aide de shouldShowPermissionRationale.
==
Ma réponse originale:
Le seul moyen que j'ai trouvé est de savoir par vous-même si c'est la première fois ou non (par exemple en utilisant les préférences partagées). Si ce n'est pas la première fois, utilisez
shouldShowRequestPermissionRationale()
pour différencier.Voir aussi: Android M - vérifier l'autorisation d'exécution - comment déterminer si l'utilisateur a coché "Ne plus jamais demander"?
la source
D'après ce que je comprends, shouldShowRequestPermissionRationale () exécute un certain nombre de cas d'utilisation sous le capot et notifie à l'application si elle doit ou non afficher une explication sur les autorisations demandées.
L'idée derrière les autorisations d'exécution est que la plupart du temps, l'utilisateur dira Oui à la demande d'autorisation. De cette façon, l'utilisateur n'aura qu'à faire un seul clic. Bien sûr, la demande doit être utilisée dans le bon contexte - c'est-à-dire demander l'autorisation de la caméra lorsque le bouton "Caméra" est enfoncé.
Si l'utilisateur refuse la demande, mais après un certain temps, il appuie à nouveau sur le bouton "Appareil photo", shouldShowRequestPermissionRationale () retournera true, afin que l'application puisse montrer une explication significative pourquoi l'autorisation est demandée et pourquoi l'application ne le sera pas fonctionne correctement sans elle. Normalement, vous afficherez dans cette fenêtre de dialogue un bouton pour refuser à nouveau / décider plus tard, et un bouton pour accorder les autorisations. Le bouton Accorder les autorisations dans la boîte de dialogue de justification doit relancer la demande d'autorisation. Cette fois, l'utilisateur aura également une case à cocher "Ne plus afficher". S'il décidait de le sélectionner et de refuser à nouveau l'autorisation, il informerait le système Android que l'utilisateur et l'application ne sont pas sur la même page. Cette action aurait deux conséquences - shouldShowRequestPermissionRationale () retournera toujours false,
Mais il existe également un autre scénario possible dans lequel onRequestPermissionsResult pourrait être utilisé. Par exemple, certains périphériques peuvent avoir une politique de périphérique qui désactive la caméra (fonctionne pour CIA, DARPA, etc.). Sur ces appareils, onRequestPermissionsResult retournera toujours false, et la méthode requestPermissions () refusera silencieusement la demande.
C'est ce que j'ai compris en écoutant le podcast avec Ben Poiesz - un chef de produit sur le framework Android.
http://androidbackstage.blogspot.jp/2015/08/episode-33-permission-mission.html
la source
Publiez simplement une autre option, si vous en avez envie. Vous pouvez utiliser EasyPermissions qui a été fourni par Google lui-même, pour, comme dit, "Simplifier les autorisations système Android M".
Ensuite, vous n'avez pas à gérer
shouldShowRequestPermissionRationale
directement.la source
permissionPermanentlyDenied
interne n'appelleshouldShowPermissionsRationale
et renvoie quetrue
dans le cas où l'utilisateur n'a jamais été invité à accorder des autorisations.Si quelqu'un est intéressé par une solution Kotlin, j'ai refacturé la réponse @muthuraj pour être à Kotlin. Également modernisé un peu pour avoir un bloc de complétion au lieu d'écouteurs.
AutorisationUtil
PermissionHandler
la mise en oeuvre
la source
Vérifiez cette implémentation. fonctionne plutôt bien pour moi. en gros, vous vérifiez les autorisations dans la méthode checkPermissions () en passant une liste d'autorisations. Vous vérifiez le résultat de la demande d'autorisation sur onRequestPermissionsResult (). L'implémentation vous permet de traiter les deux cas lorsque l'utilisateur sélectionne "ne plus jamais demander" ou non. Dans cette implémentation, au cas où se sélectionnerait "ne plus jamais demander", la boîte de dialogue a une option pour l'amener à l'activité Paramètres de l'application.
Tout ce code est à l'intérieur de mon fragment. Je pensais qu'il serait préférable de créer une classe spécialisée pour ce faire, comme un PermissionManager, mais je n'en suis pas sûr.
la source
Peut être utile pour quelqu'un: -
Ce que j'ai remarqué, c'est que si nous vérifions l'indicateur shouldShowRequestPermissionRationale () dans la méthode de rappel onRequestPermissionsResult (), il n'affiche que deux états.
État 1: -Retour vrai: - Chaque fois que l'utilisateur clique sur Refuser les autorisations (y compris la toute première fois).
État 2: -Retourne faux: - si l'utilisateur sélectionne «ne plus jamais demander».
Lien pour un exemple de travail détaillé .
la source
On peut le faire de cette façon?
la source
shouldShowRequestPermissionRationale
pour l'autorisation SPECIALE, retournez toujours TRUE UNIQUEMENT après que l'utilisateur l'a refusé sans case à cocherNous sommes intéressés par la valeur FAUX
Il y a donc 3 cas perdus avec une fausse valeur:
1. il n'y avait pas une telle action auparavant et maintenant l'utilisateur décide d'accepter ou de refuser.
Définissez simplement une préférence
ASKED_PERMISSION_*
qui n'existe pas maintenant et qui serait vraie dèsonRequestPermissionsResult
son début dans tous les cas d'accord ou de refusDonc, même si cette préférence n'existe pas, il n'y a aucune raison de vérifier
shouldShowRequestPermissionRationale
2. l' utilisateur a cliqué sur accepter.
Faites simplement:
Ce qui retournera vrai et il n'y a aucune raison de vérifier
shouldShowRequestPermissionRationale
3. l' utilisateur a cliqué sur refuser avec la case à cocher (deuxième fois ou plus demandé)
C'est LE TEMPS de travailler avec
shouldShowRequestPermissionRationale
qui retournera FAUX(la préférence existe et nous n'avons pas d'autorisation)
la source
Ce code demande à l'utilisateur de demander l'autorisation pendant l'exécution, si l'utilisateur l'autorise, il exécute la méthode de résultat, si l'utilisateur refuse, il demande à nouveau avec discription avec l'utilisateur refuse (il demande à nouveau avec des instructions), mais si l'utilisateur choisit de ne plus jamais demander. il gère ne plus jamais demander, affiche l'option des paramètres ouverts avec des instructions.
la source