O botão de localização do Android é um elemento da interface do sistema personalizável projetado para simplificar a solicitação de acesso ao local exato no escopo da sessão. Ao iniciar solicitações de localização por uma ação direta do usuário, o botão melhora a privacidade do usuário e reduz o atrito das caixas de diálogo de permissão repetitivas normalmente encontradas com concessões temporárias de "apenas desta vez".
Se o app segmentar o Android 17 (nível 37 da API) ou versões mais recentes e tiver apenas recursos que exigem acesso à localização com base em sessão para funcionar, a política do Google Play exigirá que você use o botão de localização. Para mais detalhes, consulte a política do botão de localização.
Quando usar o botão de localização
Use o botão de localização para recursos que exigem acesso momentâneo e preciso à localização com base na sessão. Isso é ideal para aplicativos que não exigem acesso persistente à localização e visam reduzir os prompts repetitivos de permissão "Somente desta vez".
Os casos de uso comuns incluem:
- Funções de "Pesquisar perto de mim": encontrar hotéis, lojas ou restaurantes nas proximidades.
- Compartilhamento de local: compartilhar seu local atual uma vez com amigos ou familiares.
- Redes sociais: check-ins ou marcação de localização.
- E-commerce: preenchimento automático de um endereço para entregas.
Personalizar a interface
Para garantir que o botão corresponda à estética do seu app sem deixar de ser reconhecível, você pode modificar os seguintes elementos visuais:
- Esquema de cores do plano de fundo e do ícone.
- Estilo, tamanho e forma do contorno.
- Rótulos de texto de uma lista predefinida (por exemplo, "Usar local exato", "Compartilhar local exato").
Implementar o botão de localização
Para integrar o botão de localização, use a biblioteca Jetpack. Essa biblioteca simplifica a configuração, processa a renderização segura em plataformas mais recentes e oferece um substituto para apps destinados ao Android 16 e versões anteriores.
Etapa 1: declarar permissões no manifesto do Android
Você precisa declarar permissões de localização padrão junto com a permissão
USE_LOCATION_BUTTON dedicada exigida pelo serviço de renderização remota
do 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>
Etapa 2: implementar um combinável do Kotlin
Confira a seguir um exemplo de implementação do botão de localização, incluindo exemplos de uso das opções de personalização disponíveis que podem ser usadas para fazer a interface corresponder ao restante do 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) */ ) }
Etapa 3: processar a compatibilidade com versões anteriores
A biblioteca Jetpack processa automaticamente a compatibilidade com versões anteriores em versões anteriores do Android. Em dispositivos com o Android 16 ou versões anteriores, a biblioteca volta para um componente renderizado localmente que preserva o layout visual personalizado mas volta a acionar a solicitação de permissão de localização padrão.
Com essa abordagem, você aproveita os benefícios da adoção do botão de localização sem manter uma solução paralela para dispositivos com Android 16 ou versões anteriores.