Demander l'autorisation d'accéder à la position

Pour protéger la vie privée des utilisateurs, les applications qui utilisent les services de localisation doivent demander l'autorisation d'accéder à la position.

Lorsque vous demandez une autorisation d'accéder à la position, suivez les mêmes bonnes pratiques que pour toute autre autorisation d'exécution. S'agissant des autorisations d'accéder à la position, l'une des principales différences est que le système en comprend plusieurs. Les autorisations que vous demandez et la manière de procéder dépendent des exigences de localisation du cas d'utilisation de votre appli.

Cette page décrit les différents types d'exigences de localisation et explique comment demander l'autorisation d'accéder à la position dans chaque cas.

Types d'accès à la position

Chaque autorisation présente une combinaison des caractéristiques suivantes :

Localisation au premier plan

Si votre application contient une fonctionnalité qui ne partage ou ne reçoit des informations de localisation qu'une seule fois, ou pendant une durée déterminée, un accès à la localisation au premier plan est nécessaire. Quelques exemples :

  • Dans une application de navigation, une fonctionnalité permet aux utilisateurs d'obtenir des instructions de navigation détaillées.
  • Dans une application de chat, une fonctionnalité permet aux utilisateurs de partager leur position actuelle avec un autre utilisateur.

Le système considère que votre application utilise la localisation au premier plan si l'une des fonctionnalités de votre application accède à la position actuelle de l'appareil dans l'une des situations suivantes :

  • Une activité liée à votre application est visible.
  • Votre application exécute un service de premier plan. Lorsqu'un service de premier plan est en cours d'exécution, le système le fait savoir à l'utilisateur en affichant une notification permanente. Votre application conserve l'accès lorsqu'elle est placée en arrière-plan (par exemple, lorsque l'utilisateur appuie sur le bouton Accueil ou éteint l'écran de son appareil).

    Nous vous recommandons également de déclarer un service au premier plan de type location, comme indiqué dans l'extrait de code suivant. Sur Android 10 (niveau d'API 29) ou version ultérieure, vous devez déclarer ce type de service de premier plan.

    <!-- Recommended for Android 9 (API level 28) and lower. -->
    <!-- Required for Android 10 (API level 29) and higher. -->
    <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        <!-- Any inner elements would go here. -->
    </service>
    

Vous déclarez que la localisation au premier plan est nécessaire lorsque votre application demande l'autorisation ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION, comme indiqué dans l'extrait de code suivant :

<manifest ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

Localisation en arrière-plan

Une application nécessite un accès à la localisation en arrière-plan si l'une de ses fonctionnalités partage en continu sa position avec d'autres utilisateurs ou utilise l'API Geofencing. Quelques exemples :

  • Dans une application de partage de position avec la famille, une fonctionnalité permet aux utilisateurs de partager leur position en continu avec les membres de leur famille.
  • Dans une application IoT, une fonctionnalité permet à l'utilisateur de configurer ses appareils connectés de sorte qu'ils s'éteignent lorsqu'il quitte la maison, puis se rallument à son retour.

Le système considère que votre application utilise la localisation en arrière-plan si elle accède à la position actuelle de l'appareil dans une situation autre que celles décrites dans la section Localisation au premier plan. La précision de la localisation en arrière-plan est identique à celle de la localisation au premier plan et dépend des autorisations d'accès à la position déclarées par votre application.

Sur Android 10 (niveau d'API 29) ou version ultérieure, vous devez déclarer l'autorisation ACCESS_BACKGROUND_LOCATION dans le fichier manifeste de votre application afin de demander l'accès à la localisation en arrière-plan au moment de l'exécution. Sur les versions antérieures d'Android, lorsque votre application reçoit un accès à la localisation au premier plan, elle reçoit également automatiquement l'accès à la localisation en arrière-plan.

<manifest ... >
  <!-- Required only when requesting background location access on
       Android 10 (API level 29) and higher. -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

Exactitude

Android est compatible avec les niveaux suivants de précision de la position :

Approximative
Fournit une estimation de la position de l'appareil. Si cette estimation provient de LocationManagerService ou FusedLocationProvider, la précision est d'environ 3 kilomètres carrés. Votre application peut recevoir une position avec ce niveau de précision lorsque vous déclarez l'autorisation ACCESS_COARSE_LOCATION, mais pas l'autorisation ACCESS_FINE_LOCATION.
Exacte
Fournit une estimation de la position de l'appareil aussi précise que possible. Si cette estimation provient de LocationManagerService ou FusedLocationProvider, la précision est généralement de 50 mètres environ, voire de l'ordre de quelques mètres (ou moins) dans certains cas. Votre application peut recevoir une position avec ce niveau de précision lorsque vous déclarez l'autorisation ACCESS_FINE_LOCATION.

Si l'utilisateur accorde l'autorisation d'accéder à la position approximative, votre application n'a accès qu'à la position approximative, quelles que soient les autorisations d'accès déclarées par votre application.

Le fait que l'utilisateur n'accorde qu'un accès à la position approximative ne devrait pas empêcher votre application de fonctionner. Si une fonctionnalité de votre application a absolument besoin de la position exacte à l'aide de l'autorisation ACCESS_FINE_LOCATION, vous pouvez demander à l'utilisateur d'autoriser l'application à accéder à cette précision de localisation.

Demander l'accès à la position au moment de l'exécution

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.

Une fois que l&#39;utilisateur a sélectionné ce bouton, la boîte de dialogue correspondante du système s&#39;affiche.
Figure 1 : Fonctionnalité de partage de position nécessitant un accès à la localisation au premier plan. Cette fonctionnalité est activée si l'utilisateur sélectionne Autoriser seulement si l'appli est en cours d'utilisation.

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.

La boîte de dialogue ne fait référence qu&#39;à la position approximative et contient trois boutons, placés l&#39;un au-dessus de l&#39;autre.
Figure 2 : Boîte de dialogue des autorisations système qui s'affiche lorsque votre application demande uniquement l'autorisation ACCESS_COARSE_LOCATION.
La boîte de dialogue contient deux ensembles d&#39;options, l&#39;un au-dessus de l&#39;autre
Figure 3 : Boîte de dialogue des autorisations système qui s'affiche lorsque votre application demande les autorisations ACCESS_FINE_LOCATION et ACCESS_COARSE_LOCATION dans une seule requête d'exécution.

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

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.
locationPermissionRequest.launch(arrayOf(
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION))

Java

ActivityResultLauncher<String[]> locationPermissionRequest =
    registerForActivityResult(new ActivityResultContracts
        .RequestMultiplePermissions(), result -> {
            Boolean fineLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_FINE_LOCATION, false);
            Boolean 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 :

  1. Si nécessaire, expliquez pourquoi votre application a besoin de cette autorisation.
  2. Demandez à nouveau les autorisations ACCESS_FINE_LOCATION et ACCESS_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 :
La boîte de dialogue contient les options &quot;Passer à la position exacte&quot;, &quot;Uniquement cette fois-ci&quot; et &quot;Refuser&quot;.
Figure 4 : L'utilisateur a déjà sélectionné Approximative et Lorsque vous utilisez l'appli (dans la boîte de dialogue de la figure 3).
La boîte de dialogue contient les options &quot;Uniquement cette fois-ci&quot; et &quot;Refuser&quot;.
Figure 5 : L'utilisateur a précédemment sélectionné Approximative et Uniquement cette fois-ci (dans la boîte de dialogue de la figure 3).

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.

Le bouton qui permet d&#39;accéder à la localisation au premier plan est placé à un demi-écran de celui permettant d&#39;activer la localisation en arrière-plan.
Figure 6 : Les deux fonctionnalités nécessitent un accès à votre position, mais 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 :

  1. 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.

  2. 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.

Demander, si nécessaire, l'accès à la localisation en arrière-plan

Figure 7 : La page des paramètres contient l'option Toujours autoriser qui accorde l'accès à la localisation en arrière-plan.

Le contenu de la boîte de dialogue des autorisations dépend de la version du SDK cible

Lorsqu'une fonctionnalité de votre application demande la localisation en arrière-plan sur un appareil équipé d'Android 10 (niveau d'API 29), la boîte de dialogue des autorisations du système contient l'option Toujours autoriser. Si l'utilisateur sélectionne cette option, la fonctionnalité a accès à la localisation en arrière-plan.

Cependant, sur Android 11 (niveau d'API 30) ou version ultérieure, la boîte de dialogue système ne contient pas l'option Toujours autoriser. Les utilisateurs doivent alors activer la localisation en arrière-plan sur une page de paramètres, comme le montre la figure 7.

Vous pouvez aider les utilisateurs à accéder à cette page de paramètres en suivant les bonnes pratiques concernant la demande d'autorisation d'accès à la localisation en arrière-plan. Le processus d'attribution de l'autorisation dépend de la version du SDK cible de votre application.

L'application cible Android 11 ou version ultérieure

Si l'autorisation ACCESS_BACKGROUND_LOCATION n'a pas été accordée à votre application et que shouldShowRequestPermissionRationale() renvoie true, présentez aux utilisateurs une UI éducative comprenant les éléments suivants :

  • Explication claire de la raison pour laquelle la fonctionnalité de votre application doit accéder à la localisation en arrière-plan.
  • Libellé visible par l'utilisateur de l'option de paramètres qui accorde l'accès à la localisation en arrière-plan (par exemple, Toujours autoriser sur la figure 7). Vous pouvez appeler getBackgroundPermissionOptionLabel() pour obtenir ce libellé. La valeur renvoyée par cette méthode est localisée en fonction des préférences linguistiques de l'appareil de l'utilisateur.
  • Option permettant aux utilisateurs de refuser l'autorisation. Même si les utilisateurs refusent l'accès à la localisation en arrière-plan, ils doivent être en mesure de continuer à utiliser votre application.
Les utilisateurs peuvent appuyer sur la notification système pour modifier les paramètres de localisation d&#39;une application
Figure 8 Notification rappelant à l'utilisateur qu'il a accordé à une application l'accès à la localisation en arrière-plan.

L'application cible Android 10 ou version antérieure

Lorsqu'une fonctionnalité de votre application doit accéder à la localisation en arrière-plan, une boîte de dialogue système est présentée à l'utilisateur. Cette boîte de dialogue contient une option permettant d'accéder aux options d'autorisation d'accès à la position de votre application sur une page de paramètres.

Tant que votre application respecte les bonnes pratiques pour demander les autorisations d'accéder à la position, aucune modification ne doit être effectuée pour accepter ce comportement.

L'utilisateur peut changer la précision de la localisation en arrière-plan

Si l'utilisateur demande une position approximative, les options qui lui sont proposées dans la boîte de dialogue des autorisations d'accès à la position s'appliquent également à la localisation en arrière-plan. En d'autres termes, si l'utilisateur accorde à votre application l'autorisation ACCESS_BACKGROUND_LOCATION, mais n'accorde qu'un accès à la position approximative au premier plan, votre application n'aura accès qu'à la position approximative en arrière-plan également.

Rappel d'octroi de la localisation en arrière-plan

Sur Android 10 ou version ultérieure, la première fois qu'une fonctionnalité de votre application accède à la position de l'appareil en arrière-plan après que l'utilisateur a accordé ce type d'accès, le système planifie une notification à envoyer à l'utilisateur. Cette notification lui rappelle qu'il a accordé à l'application un accès permanent à la position de l'appareil. La figure 8 montre un exemple de notification.

Vérifier les exigences de localisation dans les dépendances du SDK de votre application

Vérifiez si votre application utilise des SDK qui dépendent des autorisations d'accéder à la position, en particulier l'autorisation ACCESS_FINE_LOCATION. Consultez cet article sur Medium pour savoir comment comprendre les comportements de vos dépendances SDK.

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