Localização aproximada

A caixa de diálogo se refere apenas à localização aproximada e
         contém três botões, um acima do outro
Figura 1. Caixa de diálogo de permissões do sistema exibida quando o app solicita apenas 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

A caixa de diálogo tem dois conjuntos de opções, uma acima da outra
Figura 2. As caixas de diálogo de permissões do sistema são exibidas quando o app é direcionado ao Android 12 e solicita 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:

  1. Se necessário, explique por que o app precisa da permissão.
  2. Solicite as permissões ACCESS_FINE_LOCATION e ACCESS_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:
A caixa de diálogo contém as opções &quot;Mudar para local
         exato&quot;, &quot;Apenas esta vez&quot; e &quot;Negar&quot;.
Figura 3. Anteriormente, o usuário selecionou Aproximada e Durante o uso do app (na caixa de diálogo da Figura 2).
A caixa de diálogo contém as opções &quot;Apenas esta vez&quot; e
         &quot;Negar&quot;.
Figura 4. Anteriormente, o usuário selecionou Aproximada e Apenas esta vez (na caixa de diálogo da Figura 2).

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:

  1. Solicite ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION.
  2. 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.
  3. 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

Figura 5. A tela de permissões de localização de um app nas configurações do sistema agora inclui a opção Usar localização exata. Essa opção é independente das configurações de acesso à localização que aparecem perto da parte superior da tela.

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:

  1. Solicite ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION.
  2. 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.
  3. Navegue até a tela de permissões do app nas configurações do sistema.
  4. 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.

  5. 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:

  1. Solicite ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION.
  2. 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.
  3. Navegue até a tela de permissões do app nas configurações do sistema.
  4. 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.

  5. 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).