ACCESS_COARSE_LOCATION
.O Android 12 é baseado em mudanças recentes da plataforma do modelo de permissões
de localização, incluindo a localização
em segundo plano e permissões
únicas. Quando um app for direcionado ao
Android 12, os usuários poderão solicitar que ele acesse apenas
informações de localização aproximada, mesmo quando o app solicitar a permissão
de execução
ACCESS_FINE_LOCATION
.
Se o app solicitar ACCESS_COARSE_LOCATION
, mas não
ACCESS_FINE_LOCATION
, a mudança descrita nesta página não terá efeito.
A Figura 1 mostra a caixa de diálogo voltada ao usuário que aparece quando o app
é direcionado ao Android 12 e solicita apenas ACCESS_COARSE_LOCATION
.
Para respeitar melhor a privacidade do usuário, recomendamos solicitar
apenas ACCESS_COARSE_LOCATION
. É possível atender à maioria dos casos de uso, mesmo quando
você tem acesso apenas às informações de localização aproximada.
Se o app for direcionado ao Android 12 e você solicitar a permissão
ACCESS_FINE_LOCATION
, também precisará solicitar a
permissão
ACCESS_COARSE_LOCATION
. Você precisa incluir as duas permissões em uma única solicitação de execução. Se
você tentar solicitar apenas ACCESS_FINE_LOCATION
, o sistema ignorará a solicitação
e registrará a mensagem de erro a seguir no Logcat:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION
.
Escolha do usuário entre a localização aproximada e exata
ACCESS_FINE_LOCATION
e ACCESS_COARSE_LOCATION
em
uma única solicitação durante a execução.Quando o app solicitar ACCESS_FINE_LOCATION
e ACCESS_COARSE_LOCATION
,
a caixa de diálogo de permissões do sistema incluirá as novas opções a seguir para o usuário:
- Exata: oferece a precisão da localização fornecida
pela permissão
ACCESS_FINE_LOCATION
. - Aproximada: oferece a precisão da localização fornecida
pela permissão
ACCESS_COARSE_LOCATION
.
A Figura 2 mostra que a caixa de diálogo contém uma dica visual para ambas as novas opções para ajudar o usuário a escolher. Após o usuário decidir sobre o tipo da localização, ele tocará em um dos três botões para selecionar a duração da concessão de permissão. Esses botões são os mesmos exibidos nas caixas de diálogo de permissão de localização em dispositivos com o Android 11 (nível 30 da API).
No Android 12, os usuários podem acessar as configurações do sistema para definir a precisão de localização preferencial de qualquer app, independentemente da versão do SDK de destino. Isso acontece mesmo quando o app é instalado em um dispositivo com o Android 11 ou versões anteriores e, em seguida, faz upgrade para o Android 12. Se o usuário fizer downgrade do acesso à localização do app de exata para aproximada na caixa de diálogo de permissão ou nas configurações do sistema, o sistema reiniciará o processo do app. Por esses motivos, é especialmente importante seguir as práticas recomendadas para solicitar permissões de execução.
A escolha do usuário afeta as concessões de permissão
A tabela a seguir mostra as permissões que o sistema concede ao app, com base nas opções que o usuário escolhe na caixa de diálogo das permissões de execução:
Exata | Aproximada | |
---|---|---|
Durante o uso do app | ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
Apenas esta vez | ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
Negar | Sem permissão de localização | Sem permissão de localização |
Para determinar quais permissões o sistema concedeu ao app, confira o valor de retorno da solicitação de permissões. Você pode usar as bibliotecas do Jetpack em códigos parecidos com o do exemplo a seguir, ou usar bibliotecas da plataforma, em que você gerencia o código de solicitação de permissão por conta própria.
Kotlin
val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
Java
ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); Boolean coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION });
A escolha do usuário também afeta a localização em segundo plano
Se o sistema conceder a permissão
ACCESS_BACKGROUND_LOCATION
ao app, as opções do usuário na caixa de diálogo de permissões de localização
também se aplicarão à localização em segundo plano.
Por exemplo, se o usuário conceder ao app a permissão ACCESS_BACKGROUND_LOCATION
,
mas apenas para acesso à localização aproximada em primeiro plano, o app
também terá acesso à localização aproximada em segundo plano.
Fazer upgrade para localização exata
A localização aproximada poderá afetar o app se ele depender do
acesso à localização exata usando a permissão ACCESS_FINE_LOCATION
.
Antes de pedir ao usuário para atualizar o acesso do app para a localização exata,
considere se o caso de uso do app realmente exige esse nível de
precisão. Se o app precisar parear um dispositivo com outros próximos por Bluetooth
ou Wi-Fi, use o pareamento de dispositivo
complementar ou as novas
permissões de Bluetooth, em vez de
solicitar a permissão ACCESS_FINE_LOCATION
.
Para solicitar que o usuário faça upgrade do acesso de localização do app de aproximada para exata, faça o seguinte:
- Se necessário, explique por que o app precisa da permissão.
- Solicite as permissões
ACCESS_FINE_LOCATION
eACCESS_COARSE_LOCATION
juntas novamente. Como o usuário já autorizou o sistema a conceder uma localização aproximada ao app, a caixa de diálogo do sistema será diferente desta vez, como mostrado na Figura 3 e na Figura 4:
Testar como o app processa a localização aproximada
Para avaliar se você precisa atualizar o app para oferecer compatibilidade com a precisão de localização configurável pelo usuário, conclua os testes descritos nesta seção.
Processar a solicitação de localização aproximada da caixa de diálogo
Para conferir como o app processa a solicitação de um usuário para ter acesso à localização aproximada da nova caixa de diálogo, faça o seguinte:
- Solicite
ACCESS_FINE_LOCATION
eACCESS_COARSE_LOCATION
. - Na caixa de diálogo exibida (Figura 2), selecione Aproximada perto da parte superior, e Durante o uso do app ou Apenas esta vez perto da parte inferior.
- Confira se os casos de uso do app ainda funcionam conforme o esperado, mesmo se ele tiver acesso apenas à localização aproximada.
Processar o downgrade de localização aproximada das configurações do sistema
Para conferir como o app processa a solicitação de um usuário para mudar o acesso à localização do app de aproximada para exata nas configurações do sistema, faça o seguinte:
- Solicite
ACCESS_FINE_LOCATION
eACCESS_COARSE_LOCATION
. - Na caixa de diálogo exibida (Figura 2), selecione Exata perto da parte superior, e Durante o uso do app ou Apenas esta vez perto da parte inferior.
- Navegue até a tela de permissões do app nas configurações do sistema.
Na tela de permissão de localização, desative a opção Usar localização exata. Essa opção é mostrada na Figura 5.
Como com qualquer downgrade de permissão, o sistema reiniciará o processo do app.
Confira se os casos de uso do app ainda funcionam conforme o esperado, mesmo se ele tiver acesso apenas à localização aproximada.
Gerenciar o upgrade de localização exata das configurações do sistema
Para conferir como o app processa a solicitação de um usuário para mudar o acesso à localização do app de acordo com as configurações do sistema, faça o seguinte:
- Solicite
ACCESS_FINE_LOCATION
eACCESS_COARSE_LOCATION
. - Na caixa de diálogo exibida (Figura 2), selecione Aproximada perto da parte superior, e Durante o uso do app ou Apenas esta vez perto da parte inferior.
- Navegue até a tela de permissões do app nas configurações do sistema.
Na tela de permissão de localização, ative a opção Usar localização exata, conforme mostrado na Figura 5.
Como essa mudança da permissão é um upgrade, o sistema não reiniciará o app.
Confira se o app recebe dados de localização mais precisos nos casos de uso com base em localização.
Conferir se há requisitos de localização nas dependências do SDK do app
Confira se o app usa SDKs que dependem da permissão
ACCESS_FINE_LOCATION
. Consulte este artigo no Medium sobre como se familiarizar com os comportamentos
das dependências
do SDK (em inglês).