Demander l'accès à la position en fonction de la session avec le bouton de localisation

Le bouton de localisation Android est un élément d'interface utilisateur système personnalisable conçu pour simplifier la façon dont vous demandez l'accès à la position exacte à l'échelle de la session. En initiant les demandes de localisation par le biais d'une action directe de l'utilisateur, le bouton améliore la confidentialité des utilisateurs et réduit les frictions liées aux boîtes de dialogue d'autorisation répétitives généralement rencontrées avec les autorisations temporaires "cette fois-ci uniquement".

Si votre application cible Android 17 (niveau d'API 37) ou version ultérieure et ne contient que des fonctionnalités qui nécessitent un accès à la localisation basé sur la session pour fonctionner, le règlement Google Play vous oblige à utiliser le bouton de localisation. Pour en savoir plus, consultez le Règlement sur le bouton de localisation.

Démonstration du parcours dans l'application avec le bouton de localisation
Figure 1. Démonstration du parcours utilisateur du bouton de localisation.

Quand utiliser le bouton de localisation ?

Utilisez le bouton de localisation pour les fonctionnalités qui nécessitent un accès ponctuel et basé sur la session à la position exacte. Cette approche est idéale pour les applications qui n'ont pas besoin d'un accès permanent à la position et qui visent à réduire les invites d'autorisation répétitives "Cette fois seulement".

Vous trouverez ci-dessous des cas d'utilisation courants :

  • Fonctions "Rechercher à proximité" : trouver des hôtels, des magasins ou des restaurants à proximité.
  • Partage de position : partagez votre position actuelle une seule fois avec vos amis ou votre famille.
  • Réseaux sociaux : enregistrements ou géolocalisation.
  • E-commerce : saisie automatique d'une adresse de livraison.

Personnaliser l'UI

Pour vous assurer que le bouton correspond à l'esthétique de votre application tout en restant reconnaissable, vous pouvez modifier les éléments visuels suivants :

  • Schéma de couleurs de l'arrière-plan et de l'icône.
  • Style, taille et forme du contour.
  • Libellés textuels issus d'une liste prédéfinie (par exemple, "Utiliser la position exacte", "Partager la position exacte").
Démonstration des options de personnalisation du bouton de localisation
Figure 2 : Exemples d'options de personnalisation du bouton de localisation.

Implémenter le bouton de localisation

Pour intégrer le bouton de localisation, utilisez la bibliothèque Jetpack. Cette bibliothèque simplifie la configuration, gère le rendu sécurisé sur les plates-formes plus récentes et fournit une solution de secours pour les applications ciblant Android 16 et les versions antérieures.

Étape 1 : Déclarer les autorisations dans le fichier manifeste Android

Vous devez déclarer les autorisations de localisation standards ainsi que l'autorisation USE_LOCATION_BUTTON dédiée requise par le service de rendu à distance du système.

<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2026 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          https://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 1. Standard Coarse and Fine Location Permissions -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <!-- Optional: If your app is only using the location button to access 
    location, you should add the "onlyForLocationButton" flag shown below to
    your ACCESS_FINE_LOCATION declaration.

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" 
    android:usesPermissionFlags="onlyForLocationButton"/>

    Note: Adding this flag restricts your app from accessing the precise 
    location permission via the broader permission, and that users will be 
    required to use the location button in order to share precise location with 
    the app. This is designed to improve user privacy & trust when granting location access.
    -->

    <!-- 2. CRITICAL: Required system permission for rendering the LocationButton -->
    <uses-permission android:name="android.permission.USE_LOCATION_BUTTON" />

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="LocationButtonSample"
        android:theme="@style/Theme.PinPoint">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Étape 2 : Implémenter le composable Kotlin

Voici un exemple d'implémentation du bouton de localisation, y compris des exemples d'utilisation des options de personnalisation disponibles qui peuvent être utilisées pour que l'UI corresponde au reste de l'application.

import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.core.locationbutton.compose.LocationButton
import androidx.core.locationbutton.compose.LocationButtonTextType

@Composable
fun LocationPermissionScreen(onPermissionGranted: () -> Unit, onPermissionDenied: () -> Unit) {
    // Renders the secure system-trusted Location Button composable
    LocationButton(
        // Callback triggered when the user taps the secure button and makes a decision on the permission dialog
        onPermissionResult = { isGranted ->
            if (isGranted) {
                onPermissionGranted()
            } else {
                onPermissionDenied()
            }
        },
        /* ============================================================================
         * VISUAL CUSTOMIZATIONS
         * Un-comment any of the parameters below to customize the button's aesthetics.
         * If omitted, the button falls back to secure, high-contrast system defaults.
         * ============================================================================ */
        /*
        // LABEL TEXT TYPE:
        // Predefined system strings rendered inside the secure process.
        // Options: PreciseLocation, UsePreciseLocation, SharePreciseLocation,
        // NearMyPreciseLocation, or None (for an icon-only button).
        textType = LocationButtonTextType.UsePreciseLocation,

        // COLOR PALETTE:
        // Customize the container background, text label, and icon tint colors.
        backgroundColor = Color(0xFF00796B), // e.g., Material Teal
        textColor = Color.White,
        iconTint = Color(0xFFFFC107),        // e.g., Amber icon tint

        // CORNER RADIUS & SHAPE:
        // Define the resting corner radius and the morphed radius when pressed.
        cornerRadius = 24.dp,        // Rounded capsule shape
        pressedCornerRadius = 12.dp, // Morphs to sharper corners on tap

        // OUTLINE STROKE (BORDERS):
        // Add a contrasting outline stroke around the button bounds.
        strokeColor = Color(0xFF004D40),
        strokeWidth = 2.dp,

        // INTERACTIVE TOUCH PADDING:
        // Defines the secure clickable touch target boundary.
        // Coerced securely by the system between 4.dp and 8.dp.
        clickablePadding = PaddingValues(6.dp)
        */
    )
}

Étape 3 : Gérer la rétrocompatibilité

La bibliothèque Jetpack gère automatiquement la rétrocompatibilité sur les versions antérieures d'Android. Sur les appareils équipés d'Android 16 ou version antérieure, la bibliothèque revient à un composant rendu localement qui préserve la présentation visuelle personnalisée, mais revient au déclenchement de l'invite d'autorisation d'accéder à la position standard.

Cette approche vous permet de profiter des avantages de l'adoption du bouton de localisation sans avoir à maintenir une solution parallèle pour les appareils équipés d'Android 16 ou version antérieure.