Blog technique sur mes expériences de développeur.
13 février 2016
En complément de mon cours sur la géolocalisation et la manipulation de Google Maps dans une application Android que j’écris actuellement pour OpenClassrooms, j’ai écrit un cours la gestion des permissions sous Android en revenant largement sur les nouveautés liées à Android 6.0.
Ce cours est actuellement dans le CourseLab d’OpenClassrooms et, par conséquent manque de visibilité. En attendant que le contenu du cours soit validé par l’équipe du site, je vais vous proposer une série de 6 articles correspondant à ce que j’ai pu écrire sur le site d’OpenClassrooms.
L’intégralité de ce cours est disponible dans le CourseLab OpenClassrooms !
Vous vous apprêtez à développer une application Android dans laquelle vous souhaitez accéder à la position de l’utilisateur, à ses contacts, son agenda ou encore ses photos ? Vous souhaitez savoir si vous avez le droit de le faire et si oui sous quelles conditions ? Ce cours est fait pour vous !
Android, comme l’ensemble des systèmes d’exploitations mobiles, évolue régulièrement afin de sans cesse proposer aux utilisateurs une meilleure expérience d’utilisation. Ces évolutions, de natures diverses (design, sécurité, etc.) ne font pas qu’impacter le système d’exploitation puisqu’elles touchent également les applications et donc ceux qui les développent.
Parmi les dernières évolutions qui ont impactées de manière forte les développeurs nous pouvons par exemple citer l’arrivée du material design et de nombreux composants graphiques avec Android 5, également appelé Android Lollipop :
Android 6, également nommé Android Marshmallow, a également apporté son lot de nouveautés dont une particulièrement impactante pour les développeurs : une toute nouvelle gestion des permissions.
Dans ce cours, je vous propose, dans un premier temps de revenir sur cette nouveauté pour bien comprendre ce qui change vraiment et quelles actions vous aller devoir prendre dans vos applications. Finalement, nous verrons ensemble comment implémenter tous ces changements au sein de votre application Android.
Dans ce premier chapitre, qui ne se veut pas technique, nous allons revenir sur ce qui change au niveau des permissions avec l’arrivée d’Android 6.0, mais avant ça, revenons sur le principe même des permissions.
Pour bien comprendre ce qu’est une permission, il est également important de comprendre que ce n’est pas un concept propre à Android. En effet, on retrouve ce concept sur tous les systèmes d’exploitations mobiles ou presque et notamment ceux qui dominent le marché comme iOS ou Windows Phone / Windows Store / Windows 10.
Avant même de revenir sur le système de permissions avant l’arrivée d’Android Marshmallow, il convient de comprendre à quoi sert ce système.
Une application mobile, quelque soit le système d’exploitation sur lequel elle tourne, peut potentiellement faire des milliers de choses. A titre d’exemple, une application peut :
Pour tenter de garantir la sécurité des utilisateurs, une application, en fonction de ce quelle souhaite faire doit demander des permissions. Aussi, une application n’envoie pas et n’affiche pas des SMS, elle est autorisée à le faire. Une application mobile ne surfe pas sur internet, elle est autorisée à le faire. Une application mobile n’accède pas aux photos de l’utilisateur, elle est autorisée à le faire.
Mais à quoi ça sert de demander ces permissions ?
Déclarer qu’une application utilise telle ou telle permission permet aux utilisateurs qui installent et utilisent une application de potentiellement repérer un abus et / ou une utilisation malveillante.
Il ne faut bien évidemment pas tomber dans la paranoïa, aussi, ce n’est pas parce que votre application qui affiche les horaires de votre bus demande un accès à votre micro, votre appareil photo et l’espace de stockage du téléphone qu’il faut obligatoirement s’alarmer. Peut-être que cette application propose une fonctionnalité de commande vocale justifiant l’accès micro ? Peut-être également qu’il est possible de scanner des QR codes placés sur les arrêts de bus directement depuis l’application ? Peut-être que l’accès à l’espace de stockage est nécessaire pour mettre en cache certaines données ?
Vous l’aurez compris, il existe des centaines voir des milliers de cas d’utilisation pouvant justifier la demande d’une permission au sein d’une application, cependant, soyez prudents ! Grâce à ces permissions, qu’est-ce qui peut empêcher une application de scanner vos contacts pour récupérer leurs coordonnées, de lire vos SMS ou encore d’envoyer des SMS à un service payant ?
Il existe deux moyens de connaître les permissions demandées par une application :
Avant de lancer l’installation d’une application depuis le Google Play Store, il est possible, à partir de la fiche de l’application, de consulter les permissions de l’application en cliquant sur “Détails des autorisations”.
Une fois l’application installée, il est possible de connaître les permissions accordées à l’application en passant par le gestionnaire d’applications de votre téléphone comme en témoigne la capture d’écran suivante :
Avant Android 6.0 la gestion des permissions était peu poussée. En effet, sur certains systèmes d’exploitation, comme par exemple iOS, certaines permissions pouvaient être acceptées ou refusées de manière individuelle dans l’application, Android, dans ses anciennes versions, partait du principe qu’accepter l’installation d’une application c’était accepter toutes les permissions demandées.
Cette acceptation est une action utilisateur, puisqu’à l’installation de l’application, l’utilisateur doit accepter les permissions demandées par l’application.
Cette demande d’acceptation monolithique n’offre donc que peu de possibilités à l’utilisateur :
Depuis Android 6.0 les règles ont légèrement changé !
Conscient du problème que nous avons évoqué quelques lignes plus haut, Google a décidé de se calquer sur ce que propose iOS : une demande explicite d’autorisation au moment où celle-ci est nécessaire.
Qu’est-ce que ça signifie ?
Cela signifie que ce n’est pas parce qu’une application demande une autorisation qu’elle pourra nécessairement y avoir accès. Prenons un exemple simple : une demande de géolocalisation. Avant, à condition d’avoir déclaré la permission d’accès au GPS, une application pouvait tenter de vous géolocaliser sans votre consentement. Depuis Android 6.0, ce n’est plus suffisant. En effet, l’application doit, au moment de lancer la géolocalisation, vous demander explicitement l’autorisation de vous géolocaliser. Cette demande explicite se fait donc au sein de l’application à l’aide d’une boite de dialogue.
Comme vous pouvez le constater dans la capture d’écran ci-dessus, plusieurs scénarios sont possibles :
Bref, autant de scénario que vous devrez prendre en compte en tant que développeur ! ;)
A l’image de ce que proposait Android dans ses versions précédentes, il est toujours possible de connaître les permissions demandées par une application installée sur un téléphone grâce au gestionnaire d’application.
Si l’on compare la capture d’écran des permissions d’une application sur un téléphone qui n’est pas sous Android 6.0 et celle d’un téléphone qui est sous Android 6.0, on remarque une différente de taille hormis le design : sur Android 6.0 il est possible de désactiver ou activer une permission !
Qu’est-ce que ça signifie ?
Cela signifie tout simplement, qu’à tout moment, l’utilisateur peut ne plus autoriser l’application à accéder à certaines fonctionnalités du téléphone (comme l’appareil photo, le GPS, etc.) même si la permission a été acceptée précédemment. C’est une information capitale qu’il conviendra de prendre en compte dans le développement de vos applications.
Comme je le disais au cours des précédentes lignes, il existe de nombreuses permissions. Aussi, une application nécessite, par exemple, une permission pour :
Cela signifie-t-il que je dois explicitement demander l’autorisation à l’utilisateur pour chacune des permissions ?
La réponse est… non ! :D
Comme vous le faisiez dans une application pré-marshmallow, toutes les permissions devront apparaître dans le manifest de votre application. De ce côté là, rien ne change. Cependant, vous n’êtes pas obligé de demander explicitement l’autorisation d’utiliser une permission pour chacune d’entre elles.
En effet, depuis Android 6.0, Google distingue deux types de permissions :
Nous reviendrons sur ces deux types de permissions et sur ce qui les différencie dans le prochain chapitre.