Android 6 : Les permissions

Ce tutoriel va faire un tour de l’utilisation des permissions sur Android et aborder la demande des permissions au RunTime (obligatoire depuis Android M).
Une application Android se trouve dans une sandbox et si elle a besoin d’utiliser une informations endors de son scope elle aura besoin d’une permission.
Sur Android 6 et supérieur l’utilisateur confirmera chaque permission au RunTime (une popup lui demandera d’accorder la permission à votre application) mais pour les versions inférieures la permission sera donnée à l’installation de l’application.

En tant que développeur, vous ne devez pas demander des permissions inutiles ou non essentielle à votre application. Plus la liste des permissions sera élevée plus l’utilisateur sera reticent à installer votre application.

Déclarer une permission

Pour déclarer une permission, utilisez la balise dans le manifest de votre application.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tutos.android.permissiontutorial" >
    
    <uses-permission android:name="android.permission.INTERNET"

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        ......
    </application>

</manifest>

Une fois la permission déclarer deux cas se présente :

    • Si la permission touche à la vie privée de l’utilisateur, une popup demandera à l’utilisateur de vous donner la permission
      Si la permission ne concerne pas la vie privée de l’utilisateur, elle sera automatiquement donnée
      Pour plus d’information sur les permissions garantie automatiquement, regardez cette page
  • Demander une permission au RunTime

    A partir d’Android 6 (API 23) l’utilisateur donne les permissions au moment ou l’application utilise la fonctionnalité cible. Par exemple, un utilisateur peux donner accès au GPS à une application mais refusé de donner l’accès à la liste des contacts. L’utilisateur peux aussi autoriser / supprimer des permissions dans l’écran dédié à cet effet dans les paramètres.

    device-2015-11-22-133258

    Il faut, à chaque utilisation d’une fonctionnalité nécessitant une permission, vérifier si la permission est donnée ou non à l’aide de la méthode checkSelfPermission.

    int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.WRITE_CALENDAR);
    

    Si la permission est garantie, permissionCheck sera égale à PackageManager.PERMISSION_GRANTED et à PERMISSION_DENIED sinon.

    Vous pouvez utiliser la même méthode dans la classe Context (mais uniquement disponible sur Android 6), mais il est conseillé d’utiliser la classe ContextCompat qui sera disponible quelques soit la version d’android. Ce qui vous évite de faire du code spécifique à chaque méthode.

    La méthode shouldShowRequestPermissionRationale permet de savoir si la permission à déja était demandé par l’utilisateur.Si oui, mieux vaux ne pas redemander la permission à l’utilisateur. Sinon, vous pouvez demander la permission à l’aided e la méthode requestPermissions.
    La variable MY_PERMISSIONS_REQUEST_READ_CONTACTS servira lors du callback pour savoir si la permission est garantie ou non.

        private static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.READ_CONTACTS)
                    != PackageManager.PERMISSION_GRANTED) {
    
                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.READ_CONTACTS)) {
                   //Cela signifie que la permission à déjà était 
                   //demandé et l'utilisateur l'a refusé
                   //Vous pouvez aussi expliquer à l'utilisateur pourquoi
                   //cette permission est nécessaire et la redemander
                } else {
                    //Sinon demander la permission
                    ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.READ_CONTACTS},
                            MY_PERMISSIONS_REQUEST_READ_CONTACTS);
                }
            }
        }
    

    Une fois la permission demandée, le résultat de la demande sera retourné dans la méthode onRequestPermissionsResult (à surcharger).

        @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], 
                                               int[] grantResults) {
            switch (requestCode) {
                case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // La permission est garantie
                    } else {
                        // La permission est refusée
                    }
                    return;
                }
            }
        }
    

    Pour conclure, quelques petits conseils :

    • Ne demander une permission que si elle est nécessaire
    • Expliquer à l’utilisateur, pourquoi votre application nécessite cette permission
    • Ne pas harceler l’utilisateur pour qu’il vous donne la permission
    • Accepter la decision de l’utilisateur

    Vous pouvez tester le comportement de votre application lorsque l’utilisateur garantie votre permission ou non à l’aide d’adb et plus particulièrement à l’aide de la ligne de commande

     adb shell pm [grant|revoke] <permission-name> ... 

    N’hésitez pas si vous avez des questions.

    6 commentaires


    1. Je dirai même plus : un grand merci pour l’ensemble des tutos.

      Développeur dans d’autres langages, je n’y connaissais rien ni en java ni en android. En assemblant 3 ou 4 tutoriaux différents, j’ai pu construire ma première application et petit à petit me familiariser avec les concepts dont j’avais besoin.

      Répondre

    2. Très bien expliqué. Merci beaucoup et bonne continuation.

      Répondre

    3. Bonjour, sympathique tuto mais il y a pas mal de fautes d’orthographe à corriger !

      Répondre

      1. salut j’aurais besoin d’aide peux tu m’aide ? j’ai skype si besoin : damienmrt

        Répondre

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *