Solicitar permissões de localização

Há várias maneiras de solicitar informações de localização do usuário no Android, e o melhor caminho varia de acordo com o caso de uso. Este guia descreve diferentes cenários de acesso à localização e explica como solicitar permissões de localização em cada caso.

Para começar, revise as práticas recomendadas para todas as permissões de execução, bem como as orientações mais amplas para minimizar as solicitações de permissões.

Tipos de acesso à localização

Cada permissão tem uma combinação das seguintes características:

Localização em primeiro plano

Se o app tiver um recurso que compartilhe ou receba informações de localização apenas uma vez ou por um período definido, esse recurso exigirá acesso à localização em primeiro plano. Veja alguns exemplos:

  • Em um app de navegação, um recurso permite que os usuários recebam navegação guiada.
  • Em um app de mensagens, um recurso permite que os usuários compartilhem a localização atual com outro usuário.

O sistema considera que seu app está usando a localização em primeiro plano se um recurso do app acessar a localização atual do dispositivo em uma das seguintes situações:

  • Uma atividade pertencente ao seu app está visível.
  • Seu app está executando um serviço em primeiro plano. Quando um serviço em primeiro plano está em execução, o sistema aumenta o reconhecimento do usuário mostrando uma notificação contínua. O app mantém o acesso quando é colocado em segundo plano, como quando o usuário pressiona o botão Home no dispositivo ou desliga a tela.

    Além disso, declare um tipo de serviço em primeiro plano de location, conforme mostrado no snippet de código a seguir. No Android 10 (nível 29 da API) e versões mais recentes, é necessário declarar esse tipo de serviço em primeiro plano.

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

Declare a necessidade de localização em primeiro plano quando seu app solicitar a ACCESS_COARSE_LOCATION permissão ou a ACCESS_FINE_LOCATION permissão, conforme mostrado no snippet a seguir:

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

Acesso único : além de acessar dados de localização em primeiro plano, alguns casos de uso têm a distinção adicional de só precisar acessar a localização do usuário em pontos específicos da experiência do app, em vez de atualizar de forma consistente durante o uso do app. Para esses casos, os apps precisam usar o botão de localização para solicitar acesso à localização para essa sessão individual de uso do app. Além disso, se o app for destinado ao Android 17 (nível 37 da API) ou mais recente e contiver apenas recursos que exigem acesso à localização com base na sessão, 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.

Localização em segundo plano

Um app exige acesso à localização em segundo plano se um recurso do app compartilha constantemente a localização com outros usuários ou usa a API Geofence. Entre os exemplos estão os seguintes:

  • Em um app para compartilhamento de local com a família, um recurso permite que os usuários compartilhem a localização com os membros da família de forma contínua.
  • Em um app de IoT, um recurso permite que os usuários configurem os dispositivos da casa para que sejam desligados quando eles saem de casa e ligados novamente quando voltam.

O sistema considera que seu app está usando a localização em segundo plano se ele acessa a localização atual do dispositivo em qualquer situação diferente das descritas na seção primeiro plano. A precisão da localização em segundo plano é a mesma que a precisão da localização em primeiro plano, que depende das permissões de localização declaradas pelo app.

No Android 10 (nível 29 da API) e versões mais recentes, é necessário declarar a ACCESS_BACKGROUND_LOCATION permissão no manifesto do app para solicitar acesso à localização em segundo plano durante a execução. Nas versões anteriores do Android, quando o app recebe acesso à localização em primeiro plano, também recebe acesso à localização em segundo plano automaticamente.

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

Precisão

O Android é compatível com os seguintes níveis de precisão de local:

Aproximada
Fornece uma estimativa de local do dispositivo. Se vier do LocationManagerService ou do FusedLocationProvider, essa estimativa vai ter uma precisão de aproximadamente 3 quilômetros quadrados. Seu app pode receber locais com esse nível de precisão quando você declara a permissão ACCESS_COARSE_LOCATION, mas não a ACCESS_FINE_LOCATION.
Exata
Fornece a estimativa de local do dispositivo mais precisa possível. Se ela vier do LocationManagerService ou do FusedLocationProvider, essa estimativa geralmente vai ficar dentro de 50 metros, às vezes chegando a 3 metros ou menos. Seu app pode receber locais com esse nível de precisão quando você declara a permissão ACCESS_FINE_LOCATION.

Se o usuário conceder a permissão de localização aproximada, o app só vai ter acesso ao local aproximado, independentemente das permissões que o app declarar.

O app ainda funcionará quando o usuário conceder apenas o acesso aproximado ao local. Se um recurso do seu app realmente precisar de acesso à localização precisa usando a permissão ACCESS_FINE_LOCATION, peça ao usuário para permitir que seu app acesse a localização precisa.

Lembrete da concessão de localização em segundo plano

No Android 10 (nível 29 da API) e versões mais recentes, quando um recurso do app acessa a localização do dispositivo em segundo plano pela primeira vez depois que o usuário concede acesso a ela, o sistema programa uma notificação para enviar ao usuário. Essa notificação lembra o usuário de que ele permitiu que o app acessasse a localização do dispositivo o tempo todo. Um exemplo dessa notificação é mostrado na Figura 8.

Conferir se há requisitos de localização nas dependências do SDK do app

Verifique se o app usa SDKs que dependem das permissões de localização, principalmente a permissão ACCESS_FINE_LOCATION. Consulte a postagem do blog Getting to know the behaviors of your SDK dependencies (em inglês) no Medium para saber mais.

Outros recursos

Para ter mais informações sobre permissões de localização no Android, consulte o seguinte material:

Codelabs

Vídeos

Amostras

  • App de exemplo para demonstrar o uso de permissões de localização.