Cómo solicitar acceso a la ubicación basado en la sesión con el botón de ubicación

El botón de ubicación de Android es un elemento de la IU del sistema personalizable diseñado para simplificar la forma en que solicitas acceso a la ubicación precisa centrado en la sesión. Al iniciar solicitudes de ubicación a través de una acción directa del usuario, el botón mejora la privacidad del usuario y reduce la fricción de los diálogos de permisos repetitivos que suelen encontrarse con las concesiones temporales de "Solo esta vez".

Si tu app tiene como objetivo Android 17 (nivel de API 37) o versiones posteriores y solo contiene funciones que requieren acceso a la ubicación basada en la sesión para funcionar, la política de Google Play requiere que uses el botón de ubicación. Para obtener más detalles, consulta la política del botón de ubicación.

Demostración del flujo en la app del botón de ubicación
Figura 1. Demostración del flujo de usuarios del botón de ubicación

Cuándo usar el botón de ubicación

Usa el botón de ubicación para las funciones que requieren acceso momentáneo y basado en la sesión a la ubicación precisa. Esto es ideal para aplicaciones que no requieren acceso persistente a la ubicación y que tienen como objetivo reducir las solicitudes repetitivas de permisos de "Solo esta vez".

Los casos de uso comunes incluyen los siguientes:

  • Funciones de "Buscar cerca de mí": Buscar hoteles, tiendas o restaurantes cercanos
  • Compartir ubicación: Compartir tu ubicación actual una vez con amigos o familiares
  • Redes sociales: Registros o etiquetado de ubicación
  • Comercio electrónico: Autocompletar una dirección para las entregas

Personaliza la IU

Para asegurarte de que el botón coincida con la estética de tu app y siga siendo reconocible, puedes modificar los siguientes elementos visuales:

  • Esquema de color de fondo y del ícono
  • Estilo, tamaño y forma del contorno
  • Etiquetas de texto de una lista predefinida (p. ej., "Usar la ubicación precisa", "Compartir la ubicación precisa")
Demostración del botón de ubicación con opciones de personalización
Figura 2. Ejemplos de opciones de personalización del botón de ubicación

Implementa el botón de ubicación

Para integrar el botón de ubicación, usa la biblioteca de Jetpack. Esta biblioteca simplifica la configuración, controla la renderización segura en plataformas más nuevas y proporciona una solución alternativa para las apps que tienen como objetivo Android 16 y versiones anteriores.

Paso 1: Declara permisos en el manifiesto de Android

Debes declarar los permisos de ubicación estándar junto con el permiso USE_LOCATION_BUTTON dedicado que requiere el servicio de renderización remota 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>

Paso 2: Implementa el elemento componible de Kotlin

A continuación, se muestra una implementación de ejemplo del botón de ubicación, incluidos ejemplos del uso de las opciones de personalización disponibles que se pueden usar para que la IU coincida con el resto de la 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)
        */
    )
}

Paso 3: Controla la retrocompatibilidad

La biblioteca de Jetpack controla automáticamente la retrocompatibilidad en versiones anteriores de Android. En dispositivos con Android 16 o versiones anteriores, la biblioteca recurre a un componente renderizado de forma local que conserva el diseño visual personalizado, pero vuelve a activar la solicitud de permiso de ubicación estándar.

Con este enfoque, puedes aprovechar los beneficios de adoptar el botón de ubicación sin mantener una solución paralela para dispositivos con Android 16 o versiones anteriores.