Demander des autorisations spéciales

Une autorisation spéciale protège l'accès aux ressources système particulièrement sensibles ou sans lien direct avec la confidentialité des utilisateurs. Ces autorisations sont différentes des autorisations au moment de l'installation et des autorisations d'exécution.

Figure 1 : Écran Special app access (Accès spécifiques des applis) dans les paramètres système

Voici quelques exemples d'autorisations spéciales :

  • Programmation d'alarmes exactes
  • Affichage et dessin au-dessus d'autres applications
  • Accès à toutes les données de stockage

Les applications qui déclarent une autorisation spéciale sont affichées sur la page Special app access (Accès spécifiques des applis) dans les paramètres système (figure 1). Pour accorder une autorisation spéciale à l'application, l'utilisateur doit accéder à cette page : Settings > Apps > Special app access (Paramètres > Applications > Accès spécifiques des applis).

Workflow

Pour demander une autorisation spéciale, procédez comme suit :

  1. Dans le fichier manifeste de votre application, affichez les autorisations potentiellement requises par votre application.
  2. Concevez l'expérience utilisateur de votre application de sorte que des actions spécifiques soient associées à des autorisations d'exécution spécifiques. Indiquez à l'utilisateur quelles actions peuvent l'obliger à autoriser l'application à accéder aux données utilisateur privées.
  3. Attendez que l'utilisateur appelle la tâche ou l'action dans votre application qui nécessite un accès à des données utilisateur privées spécifiques. Votre application peut alors demander l'autorisation spéciale nécessaire pour accéder à ces données.
  4. Vérifiez si l'utilisateur a déjà accordé l'autorisation spéciale requise par votre application. Pour ce faire, utilisez la fonction de vérification personnalisée de chaque autorisation. Si l'autorisation a été accordée, votre application peut accéder aux données utilisateur privées. Si ce n'est pas le cas, passez à l'étape suivante. Remarque : vous devez vérifier si vous disposez de l'autorisation chaque fois que vous effectuez une opération nécessitant cette autorisation.
  5. Présentez une justification à l'utilisateur dans un élément de l'UI en expliquant clairement à quelles données votre application tente d'accéder et quels avantages elle peut offrir à l'utilisateur s'il accorde cette autorisation. Parallèlement, comme votre application redirige l'utilisateur vers les paramètres système afin de lui permettre d'accorder l'autorisation, ajoutez également de brèves instructions spécifiant la marche à suivre. L'UI de justification doit fournir à l'utilisateur une option claire lui permettant de désactiver l'autorisation. Une fois qu'il a pris connaissance de la justification, passez à l'étape suivante.
  6. Demandez l'autorisation spéciale requise par votre application pour accéder aux données utilisateur privées. Cela impliquera probablement un intent vers la page correspondante dans les paramètres système, où l'utilisateur pourra accorder l'autorisation. Contrairement aux autorisations d'exécution, il n'existe pas de boîte de dialogue d'autorisation qui s'affiche sous forme de pop-up.
  7. Vérifiez la réponse de l'utilisateur, qu'il ait décidé d'accorder ou de refuser l'autorisation spéciale, dans la méthode onResume().
  8. Si l'utilisateur a accordé l'autorisation à votre application, vous pouvez accéder aux données utilisateur privées. S'il a refusé l'autorisation, effectuez une dégradation élégante de l'expérience de votre application afin qu'elle lui propose une fonctionnalité sans les informations protégées par cette autorisation.
Figure 2. Workflow à suivre pour déclarer et demander des autorisations spéciales sur Android

Demander des autorisations spéciales

Contrairement aux autorisations d'exécution, l'utilisateur doit accorder des autorisations spéciales depuis la page Special App Access (Accès spécifiques des applis) dans les paramètres système. Une application peut rediriger ses utilisateurs vers cette page à l'aide d'un intent, ce qui met en pause l'application et lance la page de paramètres correspondante pour une autorisation spéciale donnée. Lorsque l'utilisateur revient dans l'application, celle-ci peut vérifier si l'autorisation a été accordée dans la fonction onResume().

L'exemple de code suivant montre comment demander aux utilisateurs l'autorisation spéciale SCHEDULE_EXACT_ALARMS :

val alarmManager = getSystemService<AlarmManager>()!!
when {
   // if permission is granted, proceed with scheduling exact alarms…
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // ask users to grant the permission in the corresponding settings page
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

Exemple de code permettant de vérifier l'autorisation et de gérer les décisions utilisateur dans onResume() :

override fun onResume() {
   // ...

   if (alarmManager.canScheduleExactAlarms()) {
       // proceed with the action (setting exact alarms)
       alarmManager.setExact(...)
   }
   else {
       // permission not yet approved. Display user notice and gracefully degrade
       your app experience.
       alarmManager.setWindow(...)
   }
}

Bonnes pratiques et conseils

Les sections suivantes fournissent quelques bonnes pratiques et conseils à prendre en compte lorsque vous demandez des autorisations spéciales.

Chaque autorisation a sa propre méthode de vérification

Les autorisations spéciales fonctionnent différemment des autorisations d'exécution. Reportez-vous plutôt à la documentation de référence des API d'autorisation et utilisez les fonctions de vérification d'accès personnalisées pour chaque autorisation spéciale (par exemple, AlarmManager#canScheduleExactAlarms() pour l'autorisation SCHEDULE_EXACT_ALARMS et Environment#isExternalStorageManager() pour l'autorisation MANAGE_EXTERNAL_STORAGE).

Demande en contexte

Comme pour les autorisations d'exécution, les applications doivent demander des autorisations spéciales en contexte lorsque l'utilisateur demande une action spécifique nécessitant l'autorisation. Par exemple, attendez de demander l'autorisation SCHEDULE_EXACT_ALARMS tant que l'utilisateur n'a pas programmé l'envoi d'un e-mail à une heure spécifique.

Expliquer la demande

Avant de rediriger les utilisateurs vers les paramètres système, indiquez-leur la raison pour laquelle ils doivent passer par cette étape. Étant donné que les utilisateurs quittent temporairement l'application pour accorder des autorisations spéciales, affichez une UI intégrée avant de lancer l'intent sur la page Special App Access (Accès spécifiques des applis) dans les paramètres système. Cette UI doit expliquer clairement pourquoi l'application a besoin de l'autorisation et comment l'utilisateur doit l'accorder sur la page des paramètres.