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:
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {...
C'est ce que dit la documentation Android ( https://developer.android.com/training/permissions/requesting.html ):
Pour vous aider à trouver les situations dans lesquelles vous devez fournir des explications supplémentaires, le système fournit la méthode Activity.shouldShowRequestPermissionRationale (String). Cette méthode renvoie true si l'application a déjà demandé cette autorisation et que l'utilisateur a refusé la demande. Cela indique que vous devez probablement expliquer à l'utilisateur pourquoi vous avez besoin de l'autorisation.
Si l'utilisateur a refusé la demande d'autorisation dans le passé et choisi l'option Ne plus demander dans la boîte de dialogue système de demande d'autorisation, cette méthode renvoie false. La méthode renvoie également false si la stratégie de l'appareil interdit à l'application d'avoir cette autorisation.
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.
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_PERMISSION) {
// for each permission check if the user granted/denied them
// you may want to group the rationale in a single dialog,
// this is just an example
for (int i = 0, len = permissions.length; i < len; i++) {
String permission = permissions[i];
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
// user rejected the permission
boolean showRationale = shouldShowRequestPermissionRationale( permission );
if (! showRationale) {
// user also CHECKED "never ask again"
// you can either enable some fall back,
// disable features of your app
// or open another dialog explaining
// again the permission and directing to
// the app setting
} else if (Manifest.permission.WRITE_CONTACTS.equals(permission)) {
showRationale(permission, R.string.permission_denied_contacts);
// user did NOT check "never ask again"
// this is a good place to explain the user
// why you need the permission and ask if he wants
// to accept it (the rationale)
} else if ( /* possibly check more permissions...*/ ) {
}
}
}
}
}
Vous pouvez ouvrir les paramètres de votre application avec ce code:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
Il n'y a aucun moyen d'envoyer directement l'utilisateur à la page d'autorisation.