Nouveautés d'Android M et N : les permissions à l'exécution
Sous Android, le système de permissions a longtemps été l'une des principales préoccupations de sécurité de la plateforme, pour de nombreuses raisons...
Sous Android, le système de permissions a longtemps été l'une des principales préoccupations de sécurité de la plateforme, pour de nombreuses raisons :
- L'utilisateur n'a que deux choix : soit il accorde à l'application toutes les permissions lors de l'installation, sans savoir pourquoi ni quand l'application va les utiliser, soit il les refuse et ne peut plus du tout utiliser l'application (c'est à prendre ou à laisser).
- Une fois la permission accordée lors de l'installation, l'application peut l'utiliser pendant tout son cycle de vie sans aucune notification, et l'utilisateur ne peut pas refuser les permissions sans désinstaller l'application de son appareil.
- Le système n'est pas transparent pour les utilisateurs, ni pour les développeurs. Votre application peut proposer une fonctionnalité très utile qui nécessite une permission précise, mais si vous n'informez pas l'utilisateur et ne lui expliquez pas pourquoi vous en avez besoin, il peut la juger suspecte et décider de ne pas installer votre application.
- Android propose plus de 130 permissions uniques. Même si l'utilisateur examine les permissions une par une pendant l'installation, il peut rapidement s'y perdre (Que fait exactement BODY_SENSORS ? Quelle est la différence entre BLUETOOTH, BLUETOOTH_ADMIN et BLUETOOTH_PRIVILEGED ?)
Le système de permissions d'Android est enfin repensé !
À partir d'Android 6.0 (Marshmallow), l'application ne reçoit plus aucune permission au moment de l'installation. Elle doit au contraire demander chaque permission à l'utilisateur, une par une, à l'exécution. C'est une étape importante pour protéger la vie privée des utilisateurs : ils choisissent ce à quoi l'application peut accéder ou non, et gardent la possibilité d'utiliser l'application.
Les développeurs doivent comprendre le nouveau système de permissions et adapter leur application pour gérer tous les cas et offrir aux utilisateurs une bonne expérience.
En tant que développeur, que dois-je savoir sur le nouveau système de permissions d'Android ?
1- Il existe deux types de permissions : les permissions normales et les permissions dangereuses
- Les permissions normales permettent à l'application d'accéder à des données externes, à l'exclusion des
informations privées de l'utilisateur. Vous pouvez consulter la liste complète ici.
- Les permissions dangereuses permettent à l'application d'accéder aux informations privées de l'utilisateur.
2- Pour toutes les versions d'Android, chaque fois que vous voulez utiliser une permission (normale ou dangereuse), vous
devez ajouter la balise
3- Les permissions normales sont accordées automatiquement, et vous n'avez pas besoin de les demander à l'exécution.
4- Si vous essayez d'accéder à une information privée, vous devez demander explicitement sa « permission dangereuse » à
l'exécution, sans quoi la méthode lèvera une SecurityException qui provoquera le plantage de l'application.
5- L'utilisateur peut révoquer une permission accordée à tout moment !
6- Les permissions sont regroupées en groupes de permissions : si l'utilisateur a déjà accordé une permission d'un groupe
donné, vous pouvez utiliser toutes les autres permissions de ce groupe sans les demander à nouveau.
7- Pour adapter votre application au nouveau système de permissions, vous devez suivre la logique ci-dessous :

8- Un exemple valant mieux qu'un long discours, regardons du code. Dans cet exemple, nous allons demander la
permission SEND_SMS (voir les commentaires) :
//Unique identifier to identify each permission request
final private int REQUEST_CODE_ASK_PERMISSIONS = 999;
private void sendSMSWrapper() {
//Check to see if the permission is available
int hasSendSMSPermission = checkSelfPermission(Manifest.permission.SEND_SMS);
if (hasSendSMSPermission != PackageManager.PERMISSION_GRANTED) {
//if the permission is not granted, check if the user has already denied this request
if (!shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS)) {
//Explain to the user why we need to send the sms
Snackbar.Make(layout, "Send SMS is required to share the new events with your contacts.", Snackbar.LengthIndefinite)
.SetAction("OK", v => RequestPermissions(Manifest.permission.SEND_SMS, REQUEST_CODE_ASK_PERMISSIONS))
.Show();
return;
}
// request the permission
requestPermissions(new String[] {Manifest.permission.SEND_SMS},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
// execute your code using the user's private information
sendSMS();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
{
// Check for SEND_SMS
if (CheckSelfPermission(Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED
{
//Permission Granted
sendSMS();
} else {
// Permission Denied
var snack = Snackbar.Make(layout, "Send SMS permission is denied.", Snackbar.LengthShort);
snack.Show();
}
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
9- Pour garantir la rétrocompatibilité, nous recommandons d'utiliser la Support Library v4, qui implémente les nouvelles méthodes pour les niveaux d'API Android inférieurs à 23 : vous n'écrivez qu'un seul code et la bibliothèque renvoie la valeur correspondante selon la version d'Android. Sinon, vous devez vérifier manuellement la version d'Android et appliquer l'ancien système de permissions pour les niveaux d'API Android inférieurs à 23 et le nouveau système pour les niveaux d'API plus récents.
if (Build.VERSION.SDK_INT >= 23) {
// Runtime permission system
} else {
// Old permission system
}
10- Il est important de comprendre le nouveau système de permissions d'Android pour offrir une meilleure expérience à vos utilisateurs. Cependant, pour rendre votre code plus court et plus propre, vous pouvez gérer les permissions avec une bibliothèque tierce. Notre préférée est PermissionsDispatcher, qui fournit une API simple basée sur des annotations et couvre tous les usages de base.
11- Pour en savoir plus sur le nouveau système de permissions, vous pouvez consulter les références suivantes :
- Déclarer des permissions
- Utiliser les permissions
- Bonnes pratiques pour les permissions
- Liste de toutes les permissions Android
- Android Marshmallow 6.0 : demander une permission