Lorsqu'une fonctionnalité de votre application a besoin d'accéder à votre position, attendez que l'utilisateur interagisse avec la fonctionnalité en question avant d'effectuer la demande d'autorisation. Ce workflow suit la bonne pratique qui consiste à demander des autorisations d'exécution en contexte, comme décrit dans le guide qui explique comment demander des autorisations de l'application.
La figure 1 montre comment effectuer ce processus. L'application contient une fonctionnalité de partage de la position qui nécessite un accès à la localisation au premier plan. Cependant, l'application ne demande pas l'autorisation d'accéder à la position tant que l'utilisateur n'a pas sélectionné le bouton Partager ma position.
L'utilisateur ne peut accorder qu'une position approximative
Sur Android 12 (niveau d'API 31) ou version ultérieure, les utilisateurs peuvent demander que votre application ne récupère que les informations de position approximatives, même lorsque l'application demande l'autorisation d'exécution ACCESS_FINE_LOCATION
.
Pour gérer ce comportement potentiel, ne demandez pas l'autorisation ACCESS_FINE_LOCATION
seule. À la place, demandez les autorisations ACCESS_FINE_LOCATION
et ACCESS_COARSE_LOCATION
dans une seule requête d'exécution. Si vous essayez de demander uniquement ACCESS_FINE_LOCATION
sur certaines versions d'Android 12, le système ignore simplement la requête. Si votre application cible Android 12 ou version ultérieure, le système consigne le message d'erreur suivant dans Logcat:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Lorsque votre application demande à la fois ACCESS_FINE_LOCATION
et ACCESS_COARSE_LOCATION
, la boîte de dialogue des autorisations système propose les options suivantes à l'utilisateur :
- Exacte : permet à l'application d'obtenir des informations de position exactes.
- Approximative: permet à l'application d'obtenir uniquement des informations de position approximatives.
La figure 3 montre que la boîte de dialogue contient un repère visuel pour les deux options afin d'aider l'utilisateur à faire son choix. Une fois que l'utilisateur a choisi une précision de localisation, il doit appuyer sur l'un des trois boutons pour sélectionner la durée d'octroi de l'autorisation.
Sur Android 12 ou version ultérieure, les utilisateurs peuvent accéder à des paramètres système pour définir la précision de localisation préférée pour n'importe quelle application, quelle que soit la version du SDK cible de cette application. Cela est valable même si votre application est installée sur un appareil équipé d'Android 11 ou version antérieure, puis que l'utilisateur effectue une mise à niveau vers Android 12 ou version ultérieure.
Le choix de l'utilisateur a une incidence sur les autorisations accordées
Le tableau suivant montre les autorisations que le système accorde à votre application en fonction des options choisies par l'utilisateur dans la boîte de dialogue d'exécution des autorisations :
Exacte | Approximative | |
---|---|---|
Lorsque vous utilisez l'appli | ACCESS_FINE_LOCATION et ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
Uniquement cette fois-ci | ACCESS_FINE_LOCATION et ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
Refuser | Aucune autorisation d'accéder à la position | Aucune autorisation d'accéder à la position |
Pour déterminer les autorisations que le système a accordées à votre application, vérifiez la valeur renvoyée par votre demande d'autorisation. Vous pouvez utiliser des bibliothèques Jetpack dans un code semblable à celui présenté ci-dessous ou des bibliothèques de plate-forme dans lesquelles vous gérez vous-même le code de demande d'autorisation.
Kotlin
@RequiresApi(Build.VERSION_CODES.N) fun requestPermissions() { val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions: // https://developer.android.com/training/permissions/requesting#request-permission locationPermissionRequest.launch( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) ) }
Java
private void requestPermissions() { ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = null; Boolean coarseLocationGranted = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); } if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }); }
Demander une mise à niveau vers la position exacte
Vous pouvez demander à l'utilisateur d'autoriser votre application à accéder à une position exacte plutôt qu'approximative. Avant de demander à l'utilisateur d'augmenter le niveau précision de localisation, vous devez toutefois déterminer si le cas d'utilisation de votre application en a absolument besoin. Si votre application doit associer un appareil à des appareils à proximité via le Wi-Fi ou le Bluetooth, utilisez l'association d'un appareil associé ou les autorisations Bluetooth au lieu de demander l'autorisation ACCESS_FINE_LOCATION
.
Pour demander à l'utilisateur de mettre à niveau l'accès à la position de votre application, procédez comme suit :
- Si nécessaire, expliquez pourquoi votre application a besoin de cette autorisation.
- Demandez à nouveau les autorisations
ACCESS_FINE_LOCATION
etACCESS_COARSE_LOCATION
ensemble. Comme l'utilisateur a déjà autorisé le système à accorder une position approximative à votre application, la boîte de dialogue du système est différente cette fois-ci, comme vous pouvez le voir sur la figure 4 et la figure 5:
Ne demander initialement que la localisation au premier plan
Même si plusieurs fonctionnalités ont besoin d'accéder à la position de l'appareil, il est probable que seules certaines d'entre elles nécessitent l'accès à la localisation en arrière-plan. Il est donc recommandé que votre application effectue des demandes incrémentielles pour les autorisations d'accéder à la position, en demandant l'accès à la localisation au premier plan, puis en arrière-plan. Avec des demandes de ce type, vous donnez aux utilisateurs plus de contrôle et de transparence, dans la mesure où cela les aide à identifier les fonctionnalités de votre application qui ont besoin d'accéder à la localisation en arrière-plan.
La figure 6 illustre un exemple d'application conçue pour gérer les demandes incrémentielles. Les fonctionnalités "Afficher la position actuelle" et "Recommander des lieux à proximité" nécessitent un accès à la localisation au premier plan. Toutefois, seule la fonctionnalité "Recommander des lieux à proximité" nécessite un accès à la localisation en arrière-plan.
Pour effectuer des demandes incrémentielles, procédez comme suit :
Tout d'abord, votre application doit guider les utilisateurs vers les fonctionnalités qui doivent accéder à la localisation au premier plan, telles que "Partager la position" à la figure 1 ou "Afficher la position actuelle" à la figure 2.
Il est recommandé de désactiver l'accès des utilisateurs aux fonctionnalités qui nécessitent un accès à la localisation en arrière-plan tant que votre application n'a pas accès à la localisation au premier plan.
Par la suite, lorsque l'utilisateur explorera les fonctionnalités qui doivent accéder à la localisation en arrière-plan, vous pourrez demander ce type d'accès.
Ressources supplémentaires
Pour en savoir plus sur les autorisations d'accéder à la position sur Android, consultez les ressources suivantes :
Ateliers de programmation
Vidéos
Exemples
- Application exemple afin d'illustrer comment utiliser les autorisations d'accéder à la position