Runtime Permission est un mécanisme de demande d'autorisations pendant l'exécution de l'application, introduit dans Android 6.0 (API 23). Contrairement à l'octroi d'autorisations lors de l'installation, les runtime permissions permettent à l'utilisateur d'accorder ou de révoquer l'accès aux données confidentielles (appareil photo, géolocalisation, contacts) à tout moment. Selon Android Developers (2026), plus de 85% des applications sur Google Play utilisent au moins une runtime permission.
Points Clés
Runtime Permission est un modèle de sécurité Android dans lequel l'application demande l'accès à des données confidentielles au moment où cette fonctionnalité est réellement nécessaire à l'utilisateur. Avant Android 6.0, toutes les autorisations étaient accordées lors de l'installation de l'application, et l'utilisateur ne pouvait pas les révoquer sans désinstaller complètement l'application.
Avant Android 6.0, l'utilisateur voyait une liste de toutes les autorisations lors de l'installation et pouvait soit toutes les accepter, soit refuser l'installation. Une étude de 2015 a montré que 87% des utilisateurs ne lisent pas la liste des autorisations lors de l'installation. Android 6.0 a introduit les runtime permissions, divisant les autorisations en normales (automatiques) et dangereuses (avec demande). Android 11 a ajouté les autorisations uniques — révocation automatique à la fermeture de l'application. Android 13 a introduit le sélecteur de photos et les notifications push comme runtime permissions distinctes.
iOS utilise un modèle similaire depuis iOS 10, où l'accès à l'appareil photo, au microphone et à la géolocalisation est demandé lors de la première utilisation. Cependant, iOS n'a pas de concept d'« autorisations normales » — chaque autorisation est demandée explicitement, et le refus persiste jusqu'à ce que le développeur refasse la demande via les paramètres système.
Runtime Permission fonctionne via une boîte de dialogue système invoquée par la méthode requestPermissions() (AndroidX — ActivityResultLauncher). Le système affiche une boîte de dialogue standard avec une explication, et l'utilisateur choisit « Autoriser » ou « Refuser ». Après la réponse, un callback est déclenché où l'application traite la décision de l'utilisateur.
private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) {
startCamera()
} else {
showPermissionDeniedDialog()
}
}
}
private fun checkCameraPermission() {
when {
ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED -> {
startCamera()
}
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) -> {
showRationaleDialog { requestPermissionLauncher.launch(Manifest.permission.CAMERA) }
}
else -> {
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
}
}
}
La méthode shouldShowRequestPermissionRationale retourne true si l'utilisateur a déjà refusé la demande une fois. Dans ce cas, il est recommandé d'afficher une boîte de dialogue expliquant pourquoi l'application a besoin de l'autorisation, et seulement ensuite de refaire la demande. Cela augmente la probabilité de consentement de l'utilisateur de 30–40% (données Google I/O 2024).
Android classe toutes les autorisations en plusieurs niveaux de protection : normales, dangereuses, de signature et spéciales. Les autorisations normales sont accordées automatiquement lors de l'installation. Les autorisations dangereuses nécessitent une demande d'exécution. Les autorisations de signature sont disponibles uniquement pour les applications signées avec le même certificat.
| Groupe | Autorisations | Niveau API |
|---|---|---|
| CAMERA | CAMERA | API 23+ |
| LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, ACCESS_BACKGROUND_LOCATION | API 23+ (arrière-plan — API 29+) |
| STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, READ_MEDIA_IMAGES (API 33+) | API 23+ (modifications dans API 33) |
| PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG | API 23+ |
| MICROPHONE | RECORD_AUDIO | API 23+ |
| CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS | API 23+ |
| NOTIFICATIONS | POST_NOTIFICATIONS | API 33+ |
Les autorisations spéciales (SYSTEM_ALERT_WINDOW, WRITE_SETTINGS, MANAGE_EXTERNAL_STORAGE) nécessitent une navigation supplémentaire vers les paramètres système via Settings.ACTION_MANAGE_OVERLAY_PERMISSION. Ces autorisations ne peuvent pas être demandées via la boîte de dialogue standard du système et nécessitent une action explicite de l'utilisateur dans l'écran des paramètres.
Android 12 a introduit des changements significatifs dans le modèle des runtime permissions. Les autorisations uniques permettent d'accorder l'accès à l'appareil photo, au microphone ou à la géolocalisation pour une seule session. Dès que l'utilisateur ferme l'application, l'autorisation est automatiquement révoquée. Les indicateurs de confidentialité sont des indicateurs verts dans la barre d'état qui montrent quand une application utilise l'appareil photo ou le microphone.
// Android 12+ — gestion de l'autorisation unique de localisation
private fun checkLocationPermission() {
val permissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
val fineLocationGranted = permissions[Manifest.permission.ACCESS_FINE_LOCATION]
val coarseLocationGranted = permissions[Manifest.permission.ACCESS_COARSE_LOCATION]
if (fineLocationGranted == true) {
showUserLocation()
} else {
showLocationDisabledDialog()
}
}
permissionLauncher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
}
// Vérifier si l'autorisation a été révoquée par le système (Android 12+)
class PermissionReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_PERMISSION_REVOCATION) {
handleRevokedPermission(intent.getStringExtra(Intent.EXTRA_REVOKED_PERMISSION))
}
}
}
Android 13 a ajouté l'autorisation POST_NOTIFICATIONS au groupe dangereux, nécessitant une demande explicite pour envoyer des notifications push. Android 14 a introduit des restrictions sur la géolocalisation en arrière-plan : l'application doit obtenir l'approbation explicite de l'utilisateur à chaque demande de localisation en arrière-plan. Le sélecteur de photos (API 33+) a remplacé le besoin de READ_EXTERNAL_STORAGE pour la sélection d'images.
Le refus de l'utilisateur à une demande d'autorisation est une situation normale qui doit être traitée correctement. Il existe deux types de refus : unique (l'utilisateur a appuyé sur « Refuser ») et permanent (l'utilisateur a sélectionné « Ne plus demander »). Dans le second cas, la boîte de dialogue système n'apparaîtra plus et l'application doit rediriger l'utilisateur vers les paramètres système.
Après le premier refus, l'application doit afficher une boîte de dialogue de justification — sa propre explication de pourquoi l'autorisation est nécessaire. Si l'utilisateur refuse à nouveau, l'application doit rediriger vers l'écran des paramètres de l'application via Settings.ACTION_APPLICATION_DETAILS_SETTINGS. Material 3 recommande d'utiliser PermissionRequestBottomSheet pour une UX plus naturelle.
Il est important de ne pas bloquer complètement les fonctionnalités de l'application en cas de refus. Par exemple, si l'utilisateur a refusé la géolocalisation, l'application doit proposer une saisie manuelle de l'adresse. Pour l'appareil photo, permettre le téléchargement d'une image depuis la galerie. Google recommande de toujours fournir un mécanisme de secours pour toutes les runtime permissions.
Les runtime permissions ne sont pas seulement un mécanisme technique, mais aussi un élément de confiance de l'utilisateur envers l'application. Demander une autorisation à un moment inapproprié (par exemple, au premier lancement) réduit considérablement la probabilité de consentement. Google Play Store analyse la fréquence et le contexte des demandes d'autorisation : les applications avec des demandes agressives obtiennent des positions moins élevées dans les résultats de recherche.
Contexte — demandez l'autorisation immédiatement avant d'effectuer l'action qui la nécessite. Minimum — demandez uniquement les autorisations réellement nécessaires au fonctionnement de la fonctionnalité. Transparence — expliquez à l'utilisateur pourquoi l'autorisation est nécessaire avant la boîte de dialogue système. Révocation — abonnez-vous à ACTION_PERMISSION_REVOCATION pour gérer correctement la révocation des autorisations au moment de l'exécution.
Pour tester les runtime permissions, utilisez les commandes adb : adb shell pm revoke <package> android.permission.CAMERA permet de simuler la révocation d'autorisation sans réinstaller l'application. Espresso et UiAutomator prennent en charge les tests de boîtes de dialogue d'autorisation via GrantPermissionRule. L'intégration de ces outils dans le pipeline CI/CD est obligatoire pour les applications avec runtime permissions.
Google Play Console fournit une section d'audit des autorisations, où les développeurs peuvent voir à quelle fréquence les autorisations sont demandées, quel pourcentage d'utilisateurs accorde l'accès et quelles autorisations ont été révoquées. L'analyse de ces données aide à identifier les demandes inefficaces et à optimiser l'UX. Par exemple, si moins de 40% des utilisateurs accordent la géolocalisation, envisagez de revoir le moment de la demande et d'ajouter une justification plus convaincante.
L'utilisation de Android Vitals pour surveiller les ANR (Application Not Responding) liés aux autorisations est également critique. Si une demande d'autorisation est exécutée sur le thread principal ou si la boîte de dialogue système bloque l'interface, cela peut provoquer une ANR sur les appareils lents. Déplacez la vérification et la demande d'autorisation vers un thread séparé ou utilisez les coroutines Kotlin pour un traitement asynchrone afin d'éviter de bloquer l'interface utilisateur.
Foire Aux Questions
shouldShowRequestPermissionRationale retourne false en cas de refus permanent (lorsque l'utilisateur a sélectionné « Ne plus demander »). La méthode retourne true en cas de refus unique, permettant d'afficher une boîte de dialogue de justification. Si la méthode retourne false, la seule option est de rediriger l'utilisateur vers les paramètres système.
Oui, ActivityResultContracts.RequestMultiplePermissions permet de demander un ensemble d'autorisations en un seul appel. Le système affichera séquentiellement des boîtes de dialogue pour chaque autorisation. Il est recommandé de regrouper les autorisations logiquement liées (par exemple, CAMERA et RECORD_AUDIO pour l'enregistrement vidéo), mais de ne pas en demander plus de 2–3 à la fois.
Android TV utilise le même modèle de runtime permissions avec des boîtes de dialogue affichées sur l'écran du téléviseur. Wear OS version 3+ prend en charge les runtime permissions, mais les boîtes de dialogue sont affichées sur la montre. Pour Android Auto, toutes les autorisations sont demandées sur le téléphone, et le système de la voiture reçoit les autorisations déjà approuvées via une connexion pont.
Selon les informations préliminaires, Android 16 introduit une « expiration des autorisations » pour les autorisations uniques avec révocation automatique après 24 heures. Des exigences plus strictes pour la localisation en arrière-plan et une liste élargie d'autorisations dangereuses pour de nouvelles catégories (capteurs environnementaux, balayage Wi-Fi) sont également attendues. Les détails exacts apparaîtront au troisième trimestre 2027.
iOS ne prend pas en charge les « autorisations normales » — chaque autorisation est demandée explicitement via une boîte de dialogue système. L'utilisateur peut révoquer l'autorisation à tout moment via les paramètres. La principale différence est qu'iOS ne vérifie pas préalablement le statut de l'autorisation via un équivalent de checkSelfPermission : le système affiche automatiquement une boîte de dialogue au premier accès à une API protégée.
Résumé
POST_NOTIFICATIONS comme runtime permission ; Android 14 a renforcé les exigences de géolocalisation en arrière-plan.READ_EXTERNAL_STORAGE pour la sélection d'images.Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi