Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Les permissions sous Android (5/6) : Demander plusieurs permissions

23 avril 2016

Dans les chapitres précédents, nous avons vu tout le processus permettant de demander une autorisation de permission à un utilisateur tout en gérant les différents cas. Imaginez maintenant que dans un écran vous ayez besoin de plusieurs permissions dites dangereuses, par exemple :

  • accéder aux contacts de l’utilisateur ;
  • appeler un contact.

Il ne faudra pas répéter tout le code des chapitres précédents pour chacune des permissions. En effet, nous allons voir qu’il est possible de demander plusieurs permissions d’un coup.

Plan

Retour sur la méthode requestPermissions

Souvenez-vous, dans le chapitre précédent, nous avons vu que pour demander une permission, il convenait d’utiliser la méthode requestPermissions de la classe Fragment. Pour rappel, cette méthode accepte deux paramètres :

  • un tableau de permissions ;
  • un code unique qui nous permettra d’identifier notre demande quand nous voudrons analyser la réponse de l’utilisateur.

Je suis sûr que vous avez déjà compris. ;)

Dans le chapitre précédent, voici l’appel que nous avions fait :

requestPermissions(new String[] { permission.CALL_PHONE }, 2);

Le premier paramètre était bien un tableau, mais celui-ci ne contenait qu’une seule permission. Pour demander plusieurs permissions d’un coup, il conviendra donc d’alimenter ce tableau avec plusieurs éléments.

Illustrons l’appel de la méthode avec un exemple. Dans l’introduction de ce chapitre, je parlais d’une application permettant d’accéder aux contacts et de les appeler. Il convient donc d’accéder aux deux permissions dangereuses suivantes :

  • CALL_PHONE : pour passer un appel ;
  • READ_CONTACTS : pour lire les contacts.

Voici alors comment il conviendrait alors d’appeler la méthode requestPermissions :

requestPermissions(new String[] { permission.CALL_PHONE, permission.READ_CONTACTS }, 2);

Ce qui graphiquement se traduira par les pop-up suivantes :

Comme vous pouvez le constater, dès la première pop-up système, l’utilisateur sait combien de permissions lui seront demandés.

Gérer la réponse de l’utilisateur

Comme vous avez pu le constater dans les captures d’écran ci-dessus, pour chacune des permissions, deux choix s’offre à l’utilisateur :

  • autoriser ;
  • refuser.

Il convient donc de récupérer la réponse de l’utilisateur et vérifier que chacune des permissions a été acceptée ou non afin de pouvoir. Comme pour une demande d’une unique permission, la récupération de la réponse de l’utilisateur doit se faire au sein de la méthode onRequestPermissionsResult qui, pour rappel, est une méthode de la classe Fragment :

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

Souvenez-vous, cette méthode prend 3 paramètres :

  • requestCode : il s’agit du code unique permettant d’identifier la demande de permissions ;
  • permissions : il s’agit des permissions qui ont fait l’objet d’une demande ;
  • grandResults : il s’agit du résultat de notre demande de permission.

Les deux derniers paramètres sont des… tableaux ! Ce qui signifie que chacune des cases contiendra une permission et son statut (acceptée ou refusée).

Dans le cas de notre appel précédent, le tableau permission ressemblera à ça :

case contenu
0 permission.CALL_PHONE
1 permission.READ_CONTACTS

Il conviendra donc ensuite de gérer correctement le traitement de vos permissions sachant qu’une seule peut avoir été acceptée, ou les deux refusées, etc.

En résumé

  • Il est possible de demander plusieurs permissions d’un coup.
  • L’utilisateur n’est pas obligé de tout accepter.
  • Il convient de traiter correctement le statut de chacune des permissions demandées.

Commentaires