Selon ceci: http://developer.android.com/preview/features/runtime-permissions.html#coding une application peut vérifier les autorisations d'exécution et demander des autorisations si elles n'ont pas déjà été accordées. La boîte de dialogue suivante s'affiche alors:
Dans le cas où l'utilisateur refuse une autorisation importante, imo une application doit afficher une explication de la raison pour laquelle l'autorisation est nécessaire et de l'impact de la baisse. Cette boîte de dialogue a deux options:
- réessayez (l'autorisation est à nouveau demandée)
- refuser (l'application fonctionnera sans cette autorisation).
Si l'utilisateur vérifie Never ask again
cependant, la deuxième boîte de dialogue avec l'explication ne devrait pas être affichée, surtout si l'utilisateur a déjà refusé une fois auparavant. Maintenant, la question est: comment mon application sait-elle si l'utilisateur a vérifié le Never ask again
? L'OMI onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
ne me donne pas cette information.
Une deuxième question serait: Google envisage-t-il d'intégrer un message personnalisé dans la boîte de dialogue d'autorisation qui expliquerait pourquoi l'application a besoin de l'autorisation? De cette façon, il n'y aurait jamais de deuxième dialogue qui ferait certainement une meilleure ux.
la source
Réponses:
Developer Preview 2 apporte quelques modifications à la façon dont les autorisations sont demandées par l'application (voir également http://developer.android.com/preview/support.html#preview2-notes ).
La première boîte de dialogue ressemble maintenant à ceci:
Il n'y a pas de case à cocher "Ne plus afficher" (contrairement à l'aperçu du développeur 1). Si l'utilisateur refuse l'autorisation et si l'autorisation est essentielle pour l'application, il pourrait présenter une autre boîte de dialogue pour expliquer la raison pour laquelle l'application demande cette autorisation, par exemple comme ceci:
Si l'utilisateur refuse à nouveau, l'application doit soit fermer si elle a absolument besoin de cette autorisation, soit continuer à fonctionner avec des fonctionnalités limitées. Si l'utilisateur reconsidère (et choisit de réessayer), l'autorisation est de nouveau demandée. Cette fois, l'invite ressemble à ceci:
La deuxième fois, la case à cocher "Ne plus demander" s'affiche. Si l'utilisateur refuse à nouveau et que la case est cochée, rien de plus ne devrait se produire. Le fait de cocher ou non la case à cocher peut être déterminé en utilisant Activity.shouldShowRequestPermissionRationale (String), par exemple comme ceci:
C'est ce que dit la documentation Android ( https://developer.android.com/training/permissions/requesting.html ):
Pour savoir si l'utilisateur a refusé avec "ne plus jamais demander", vous pouvez vérifier à nouveau la méthode shouldShowRequestPermissionRationale dans votre onRequestPermissionsResult lorsque l'utilisateur n'a pas accordé l'autorisation.
Vous pouvez ouvrir les paramètres de votre application avec ce code:
Il n'y a aucun moyen d'envoyer directement l'utilisateur à la page d'autorisation.
la source
Vous pouvez enregistrer
shouldShowRequestPermissionRationale()
votreonRequestPermissionsResult()
.https://youtu.be/C8lUdPVSzDk?t=2m23s
Vérifiez si l'autorisation a été accordée ou non
onRequestPermissionsResult()
. Si pas alors vérifiershouldShowRequestPermissionRationale()
.true
montrez une explication de la raison pour laquelle cette autorisation particulière est nécessaire. Ensuite, selon le choix de l'utilisateur à nouveaurequestPermissions()
.false
affichez un message d'erreur indiquant que l'autorisation n'a pas été accordée et que l'application ne peut pas continuer ou qu'une fonctionnalité particulière est désactivée.Voici un exemple de code.
Apparemment, Google Maps fait exactement cela pour l'autorisation de localisation.
la source
Voici une méthode simple et agréable pour vérifier l'état actuel de l'autorisation:
Avertissement: renvoie BLOCKED_OR_NEVER_ASKED le premier démarrage de l'application, avant que l'utilisateur n'accepte / refuse l'autorisation via l'invite utilisateur (sur les appareils sdk 23+)
Mettre à jour:
La bibliothèque de support Android semble désormais également avoir une classe très similaire
android.support.v4.content.PermissionChecker
qui contient uncheckSelfPermission()
qui renvoie:la source
BLOCKED_OR_NEVER_ASKED
si l'autorisation n'a pas encore été demandée.android.content.pm
définit déjàPERMISSION_GRANTED = 0
etPERMISSION_DENIED = -1
. Peut-être régléBLOCKED_OR_NEVER_ASKED = PERMISSION_DENIED - 1
ou quelque chose?Une fois que l'utilisateur a coché «Ne plus demander», la question ne peut plus s'afficher. Mais il peut être expliqué à l'utilisateur qu'il a précédemment refusé l'autorisation et doit accorder l'autorisation dans les paramètres. Et référencez-le aux paramètres, avec le code suivant:
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: -Retournez true: - Chaque fois que l'utilisateur clique sur Refuser les autorisations (y compris la toute première fois).
Etat 2: -Retourne false: - si l'utilisateur sélectionne "ne demande plus".
Lien d'un exemple de travail détaillé
la source
onRequestPermissionsResult
, pas lorsque vous demandez réellement l'autorisation.Vous pouvez le déterminer en vérifiant si la justification de l' autorisation doit être affichée dans la
onRequestPermissionsResult()
méthode de rappel. Et si vous trouvez un ensemble d'autorisations à ne plus jamais demander , vous pouvez demander aux utilisateurs d'accorder des autorisations à partir des paramètres.Ma mise en œuvre complète serait comme ci-dessous. Il fonctionne pour les demandes d'autorisations uniques ou multiples . Utilisez ce qui suit ou utilisez directement ma bibliothèque.
la source
Si vous souhaitez détecter tous les "états" (refusés pour la première fois, simplement refusés, simplement refusés avec "Ne plus demander" ou refusés définitivement), vous pouvez procéder comme suit:
Créer 2 booléens
Définissez le premier avant de demander la permission:
Définissez le second dans votre méthode onRequestPermissionsResult:
Utilisez le "tableau" suivant pour faire tout ce dont vous avez besoin dans onRequestPermissionsResult () (après avoir vérifié que vous n'en avez toujours pas l'autorisation):
la source
// TRUE FALSE
se produit également lorsque l'utilisateur autorise une autorisation après l'avoir préalablement refusée.J'ai eu le même problème et je l'ai compris. Pour vous 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,
Si l'utilisateur a coché Ne plus demander , vous recevrez un rappel sur onPermissionDisabled .
Bon codage :)
la source
shouldShowRequestPermissionRationale
, en sauvegardant de préférence la requête envoyée à l'utilisateur. J'ai eu la même idée et trouvé votre réponse. Nice job manExplication complète pour chaque cas d'autorisation
la source
Une fonction utile pour déterminer si une autorisation arbitraire a été empêchée de demander (dans Kotlin):
L'utilisation de cela nécessite de définir une préférence booléenne partagée avec le nom de votre autorisation souhaitée (par exemple
android.Manifest.permission.READ_PHONE_STATE
)true
lorsque vous demandez une autorisation pour la première fois.Explication:
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
car une partie du code ne peut être exécutée qu'au niveau API 23+.ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED
pour vérifier nous n'avons pas déjà la permission.!activity.shouldShowRequestPermissionRationale(permission)
pour vérifier si l'utilisateur a de nouveau refusé l'application. En raison des particularités de cette fonction , la ligne suivante est également requise.PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(permission, false)
ceci est utilisé (avec la définition de la valeur true lors de la première demande d'autorisation) pour faire la distinction entre les états "Jamais demandé" et "Jamais demandé", car la ligne précédente ne renvoie pas ces informations.la source
La méthode shouldShowRequestPermissionRationale () peut être utilisée pour vérifier si l'utilisateur a sélectionné l'option «jamais demandé à nouveau» et a refusé l'autorisation. Il y a beaucoup d'exemples de code, donc je préfère expliquer comment l'utiliser à cette fin, car je pense que son nom et son implémentation rendent cela plus compliqué qu'il ne l'est réellement.
Comme expliqué dans Demande d'autorisations au moment de l'exécution , cette méthode renvoie true si l'option «ne plus demander» est visible, false sinon; il renvoie donc false la toute première fois qu'une boîte de dialogue est affichée, puis à partir de la deuxième fois, il renvoie true, et seulement si l'utilisateur refuse l'autorisation de sélectionner l'option, à ce stade, il renvoie à nouveau false.
Pour détecter un tel cas, vous pouvez soit détecter la séquence faux-vrai-faux, ou (plus simple) vous pouvez avoir un indicateur qui garde la trace de l'heure initiale d'affichage de la boîte de dialogue. Après cela, cette méthode renvoie true ou false, où false vous permettra de détecter lorsque l'option est sélectionnée.
la source
Veuillez ne pas me jeter de pierres pour cette solution.
Cela fonctionne mais est un peu "hacky".
Lorsque vous appelez
requestPermissions
, enregistrez l'heure actuelle.Puis dans
onRequestPermissionsResult
si le résultat n'est pas accordé, vérifiez à nouveau l'heure.
Étant donné que l'utilisateur n'a pas pu cliquer si vite sur le bouton de refus, nous savons qu'il a sélectionné "ne plus jamais demander" car le rappel est instantané.
Utilisez à vos risques et périls.
la source
J'ai écrit un raccourci pour la demande d'autorisation dans Android M. Ce code gère également la rétrocompatibilité avec les anciennes versions d'Android.
Tout le code laid est extrait dans un fragment qui s'attache et se détache à l'activité demandant les autorisations.Vous pouvez utiliser
PermissionRequestManager
comme suit:Jetez un œil: https://gist.github.com/crysxd/385b57d74045a8bd67c4110c34ab74aa
la source
la source
Essayez cette bibliothèque de permissions simple. Il gérera toutes les opérations liées à l'autorisation en 3 étapes faciles. Cela m'a fait gagner du temps. Vous pouvez terminer tous les travaux liés aux autorisations en 15 minutes .
Il peut gérer le refus, il peut gérer ne jamais demander à nouveau, il peut appeler les paramètres de l'application pour l'autorisation, il peut donner un message rationnel, il peut donner un message de refus, il peut donner une liste des autorisations acceptées, il peut donner une liste des refusés autorisations et etc.
https://github.com/ParkSangGwon/TedPermission
Étape 1: ajoutez votre dépendance
Étape 2: demander des autorisations
Étape 3: gérer la réponse d'autorisation
la source
vous pouvez écouter assez.
Auditeur
MainClass pour permission
Utilisé de cette façon
remplacer onRequestPermissionsResult en activité ou fragmnet
la source
Au lieu de cela, vous recevrez un rappel en
onRequestPermissionsResult()
tant que PERMISSION_DENIED lorsque vous demanderez à nouveau l'autorisation tout en tombant dans un état faux deshouldShowRequestPermissionRationale()
Depuis le document Android:
Lorsque le système demande à l'utilisateur d'accorder une autorisation, l'utilisateur a la possibilité de dire au système de ne plus demander cette autorisation. Dans ce cas, chaque fois qu'une application utilise
requestPermissions()
pour demander à nouveau cette autorisation, le système refuse immédiatement la demande. Le système appelle votreonRequestPermissionsResult()
méthode de rappel et passePERMISSION_DENIED
, de la même manière que si l'utilisateur avait explicitement rejeté à nouveau votre demande. Cela signifie que lorsque vous appelezrequestPermissions()
, vous ne pouvez pas supposer qu'une interaction directe avec l'utilisateur a eu lieu.la source
Vous pouvez utiliser la
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)
méthode pour détecter si jamais demander est coché ou non.Pour plus de référence: vérifiez ceci
Pour vérifier plusieurs autorisations, utilisez:
expliquer () méthode
Le code ci-dessus affichera également une boîte de dialogue, qui redirigera l'utilisateur vers l'écran des paramètres de l'application à partir duquel il peut donner l'autorisation s'il avait coché le bouton Ne plus demander
la source
Vous pouvez utiliser
à l'intérieur
Voir l'exemple ci-dessous:
Vérifiez s'il a l'autorisation lorsque l'utilisateur clique sur le bouton:
Lorsque l'utilisateur répond à la boîte de dialogue d'autorisation, nous allons passer à onRequestPermissionResult:
la source
Je souhaite également obtenir des informations, que l'utilisateur ait ou non sélectionné "ne plus jamais demander". J'ai atteint une «presque solution» avec un drapeau laid, mais avant de vous dire comment, je vais vous parler de ma motivation:
Je voudrais d'abord offrir la fonctionnalité de référence d'autorisation. Si l'utilisateur l'utilise et n'a aucun droit, il obtient soit la 1e boîte de dialogue par le haut, soit la 2e et la 3e. Lorsque l'utilisateur a choisi «Ne plus demander», je souhaite désactiver la fonctionnalité et l'afficher différemment. - Mon action est déclenchée par une entrée de texte spinner, je voudrais également ajouter «(Autorisation révoquée)» au texte de l'étiquette affiché. Cela montre à l'utilisateur: "Il y a des fonctionnalités mais je ne peux pas les utiliser, en raison de mes paramètres d'autorisation." Cependant, cela ne semble pas possible, car je ne peux pas vérifier si oui ou non "Ne plus demander" a été choisi.
Je suis arrivé à une solution avec laquelle je peux vivre en ayant toujours mes fonctionnalités activées avec une vérification d'autorisation active. J'affiche un message Toast dans onRequestPermissionsResult () en cas de réponse négative, mais uniquement si je n'ai pas affiché ma fenêtre contextuelle de justification personnalisée. Ainsi, si l'utilisateur a choisi "Ne plus jamais demander", il reçoit uniquement un message toast. Si l'utilisateur hésite à choisir `` ne plus jamais demander '', il n'obtient que la justification personnalisée et le popup de demande d'autorisation par le système d'exploitation, mais pas de toast, car trois notifications d'affilée seraient trop pénibles.
la source
Je dois implémenter une autorisation dynamique pour la caméra. Où 3 cas possibles se produisent: 1. Autoriser, 2. Refusé, 3. Ne plus demander.
la source
Expansion sur mVck la réponse de ci-dessus, la logique suivante détermine si "Ne plus demander" a été vérifié pour une demande d'autorisation donnée:
qui est extrait d'en bas (pour l'exemple complet, voir cette réponse )
la source
vous pouvez lire le document officiel android Demander les autorisations d'application
ou vous pouvez trouver de nombreuses bibliothèques de permissions Android populaires sur Github
la source
Pour répondre précisément à la question, que se passe-t-il lorsque l'utilisateur appuie sur "Ne plus demander"?
La méthode / fonction remplacée
Le tableau grantResult se révèle être vide, vous pouvez donc y faire quelque chose? Mais pas la meilleure pratique.
Comment gérer "Ne plus demander"?
Je travaille avec Fragment, qui nécessitait l'autorisation READ_EXTERNAL_STORAGE.
Les autres fonctions sont triviales.
la source