Richiedere l'accesso alla posizione basato sulla sessione con il pulsante posizione

Il pulsante posizione Android è un elemento dell'interfaccia utente di sistema personalizzabile progettato per semplificare la richiesta di accesso alla posizione esatta con ambito sessione. Avviando le richieste di posizione tramite un'azione diretta dell'utente, il pulsante migliora la privacy dell'utente e riduce l'attrito dei dialoghi di autorizzazione ripetitivi che in genere si verificano con le concessioni temporanee "Solo questa volta".

Se la tua app ha come target Android 17 (livello API 37) o versioni successive e contiene solo funzionalità che richiedono l'accesso alla posizione basato sulla sessione per funzionare, le norme di Google Play richiedono di utilizzare il pulsante Posizione. Per maggiori dettagli, consulta le norme relative al pulsante posizione.

Dimostrazione del flusso in-app del pulsante posizione
Figura 1. Dimostrazione del flusso utente del pulsante posizione.

Quando utilizzare il pulsante posizione

Utilizza il pulsante posizione per le funzionalità che richiedono l'accesso alla posizione esatta momentaneo e basato sulla sessione. È ideale per le applicazioni che non richiedono l'accesso alla posizione persistente e mirano a ridurre le richieste di autorizzazione ripetitive "Solo questa volta".

I casi d'uso comuni includono:

  • Funzioni "Cerca nelle vicinanze": per trovare hotel, negozi o ristoranti nelle vicinanze.
  • Condivisione della posizione: per condividere la tua posizione attuale una sola volta con amici o familiari.
  • Social media: per i check-in o i tag di posizione.
  • E-commerce: per compilare automaticamente un indirizzo per le consegne.

Personalizzare l'interfaccia utente

Per assicurarti che il pulsante corrisponda all'estetica della tua app pur rimanendo riconoscibile, puoi modificare i seguenti elementi visivi:

  • Combinazione di colori di sfondo e icone.
  • Stile, dimensioni e forma del contorno.
  • Etichette di testo da un elenco predefinito (ad es. "Usa la posizione esatta", "Condividi la posizione esatta").
Pulsante Posizione che mostra le opzioni di personalizzazione
Figura 2. Esempi di opzioni di personalizzazione del pulsante posizione.

Implementare il pulsante posizione

Per integrare il pulsante di posizione, utilizza la libreria Jetpack. Questa libreria semplifica la configurazione, gestisce il rendering sicuro sulle piattaforme più recenti e fornisce un fallback per le app che hanno come target Android 16 e versioni precedenti.

Passaggio 1: dichiarare le autorizzazioni nel file manifest di Android

Devi dichiarare le autorizzazioni di accesso alla posizione standard insieme all'autorizzazione dedicata USE_LOCATION_BUTTON richiesta dal servizio di rendering remoto del sistema.

<?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>

Passaggio 2: implementare il composable Kotlin

Di seguito è riportato un esempio di implementazione del pulsante posizione, inclusi esempi di utilizzo delle opzioni di personalizzazione disponibili che possono essere utilizzate per fare in modo che l'interfaccia utente corrisponda al resto dell'app.

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)
        */
    )
}

Passaggio 3: gestire la compatibilità con le versioni precedenti

La libreria Jetpack gestisce automaticamente la compatibilità con le versioni precedenti su versioni precedenti di Android. Sui dispositivi con Android 16 o versioni precedenti, la libreria esegue il fallback a un componente di rendering locale che mantiene il layout grafico personalizzato, ma torna ad attivare la richiesta di autorizzazione di accesso alla posizione standard.

Utilizzando questo approccio, puoi sfruttare i vantaggi dell'adozione del pulsante di posizione senza dover mantenere una soluzione parallela per i dispositivi con Android 16 o versioni precedenti.