Android Academy · Aula

Permissões de localização do jeito certo

Localização em primeiro plano e precisa.

Aula 4 de 413 etapas

Permissões de localização do jeito certo é uma aula grátis de Android Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Android Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Android Academy inclui 4 aulas no total.

As permissões são obrigatórias

A localização é uma das permissões mais sensíveis do Android. Declará-la no manifesto não é suficiente — nas versões modernas do Android, você precisa solicitá-la em tempo de execução e tratar todas as respostas adequadamente.

Esta lição aborda os níveis de permissão, como solicitá-los no Compose, como tratar recusas e as novas regras de localização precisa e aproximada e de execução em segundo plano.

As três permissões de localização

O Android divide a localização em níveis:

  • ACCESS_COARSE_LOCATION — aproximada (cerca de um quarteirão).
  • ACCESS_FINE_LOCATION — precisa (nível de GPS).
  • ACCESS_BACKGROUND_LOCATION — acesso enquanto seu aplicativo não está em primeiro plano.

Solicite apenas o que você realmente precisa. O acesso em segundo plano está sujeito a uma análise mais rigorosa na Play Store.

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- only if truly needed: -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Solicitando permissões no Compose

As APIs de resultado da atividade fornecem um lançador para as caixas de diálogo de permissão. No Compose, use rememberLauncherForActivityResult com o contrato RequestMultiplePermissions.

import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts

val launcher = rememberLauncherForActivityResult(
    ActivityResultContracts.RequestMultiplePermissions()
) { result ->
    val fine = result[Manifest.permission.ACCESS_FINE_LOCATION] == true
    val coarse = result[Manifest.permission.ACCESS_COARSE_LOCATION] == true
    // react to the user's choice
}

Iniciando a solicitação

Abra a caixa de diálogo chamando launch() com a matriz de permissões — normalmente em resposta ao toque em um botão, e não automaticamente ao carregar a tela.

Button(onClick = {
    launcher.launch(
        arrayOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        )
    )
}) {
    Text("Enable location")
}

Verificando se já foi concedida

Não solicite a permissão novamente se ela já tiver sido concedida. Verifique usando ContextCompat.checkSelfPermission antes de iniciar a solicitação.

import androidx.core.content.ContextCompat
import android.content.pm.PackageManager

fun hasFineLocation(context: Context): Boolean {
    return ContextCompat.checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    ) == PackageManager.PERMISSION_GRANTED
}

Precisa ou aproximada

Desde o Android 12 (API 31), os usuários podem conceder uma localização aproximada mesmo quando você solicitou a precisa. Por isso, você deve solicitar as duas juntas e aceitar que o usuário pode reduzir sua permissão para a localização aproximada.

Quando possível, projete seu recurso para funcionar de forma aceitável com uma localização aproximada.

// Request both — the system shows a Precise/Approximate toggle
launcher.launch(
    arrayOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
    )
)
// If only COARSE comes back granted, you got approximate location.

Exibindo uma justificativa

Se o usuário recusou uma vez, o Android permite verificar shouldShowRequestPermissionRationale. Quando o resultado for verdadeiro, mostre uma explicação amigável sobre por que você precisa da localização antes de perguntar novamente.

import androidx.core.app.ActivityCompat

val shouldExplain = ActivityCompat.shouldShowRequestPermissionRationale(
    activity,
    Manifest.permission.ACCESS_FINE_LOCATION
)
if (shouldExplain) {
    // show a dialog: "We use your location to find nearby stores"
}

Tratando uma recusa permanente

Se o usuário escolher Não perguntar novamente (ou recusar duas vezes), o sistema deixará de exibir a caixa de diálogo. A única opção é encaminhá-lo às configurações do aplicativo para ativar a permissão manualmente.

import android.content.Intent
import android.provider.Settings
import android.net.Uri

fun openAppSettings(context: Context) {
    val intent = Intent(
        Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
        Uri.fromParts("package", context.packageName, null)
    )
    context.startActivity(intent)
}

Usando Accompanist Permissions

A biblioteca accompanist-permissions envolve tudo isso em um estado compatível com o Compose. rememberMultiplePermissionsState acompanha o status das permissões e disponibiliza uma chamada launchMultiplePermissionRequest().

import com.google.accompanist.permissions.rememberMultiplePermissionsState

val permissions = rememberMultiplePermissionsState(
    listOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_COARSE_LOCATION
    )
)

if (permissions.allPermissionsGranted) {
    // show the map / read location
} else {
    Button(onClick = { permissions.launchMultiplePermissionRequest() }) {
        Text("Grant location")
    }
}

Regras de localização em segundo plano

A localização em segundo plano exige um fluxo de duas etapas: primeiro conceda a localização em primeiro plano (precisa/aproximada) e, depois, solicite separadamente ACCESS_BACKGROUND_LOCATION, que abre as configurações do sistema no Android 11 ou superior. A Play Store exige uma justificativa clara e uma política de privacidade.

Solicite essa permissão somente se o aplicativo realmente precisar da localização enquanto estiver fechado — por exemplo, para cercas virtuais ou monitoramento de atividades físicas.

// Step 1: request foreground first and confirm it's granted.
// Step 2: only then request background:
launcher.launch(
    arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
// On Android 11+ this sends the user to settings to pick "Allow all the time".

Um mapa protegido por permissão

Integre tudo: proteja o mapa com base no estado da permissão. Mostre o mapa somente depois que a permissão for concedida; caso contrário, mostre uma solicitação. Esse é o padrão recomendado, que respeita o usuário.

@Composable
fun LocationGate(permissions: MultiplePermissionsState) {
    when {
        permissions.allPermissionsGranted -> MapScreen()
        else -> Column {
            Text("We need location to show nearby places.")
            Button(onClick = { permissions.launchMultiplePermissionRequest() }) {
                Text("Allow location")
            }
        }
    }
}

Verificação rápida

Desde o Android 12, o usuário pode escolher a localização aproximada em vez da localização precisa. O que isso significa para sua solicitação?

Recapitulação

Agora você sabe como solicitar a localização de forma responsável:

  • Declare a localização aproximada/precisa (e a localização em segundo plano somente se for essencial) no manifesto.
  • Solicite-a em tempo de execução com as APIs Activity Result ou accompanist-permissions.
  • Solicite a localização precisa e aproximada juntas para oferecer a opção entre localização precisa e aproximada.
  • Mostre uma justificativa e encaminhe os usuários que negaram permanentemente a permissão para as configurações do aplicativo.
  • Trate a localização em segundo plano como um fluxo separado de duas etapas, com justificativa.

Isso conclui Mapas e Serviços de Localização — você pode mostrar um mapa, encontrar o usuário, posicionar marcadores e solicitar permissões da maneira correta.

Grátis para começar

Aprenda Kotlin com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
36
Aulas
152

Perguntas Frequentes

A aula “Permissões de localização do jeito certo” é grátis?

Sim — o texto completo de “Permissões de localização do jeito certo” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Android Academy, atualize para CoddyKit PRO. O curso de Android Academy inclui 4 aulas no total.

O que vou aprender em “Permissões de localização do jeito certo”?

Localização em primeiro plano e precisa. Você pratica Android Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Android Academy?

Nenhuma experiência prévia é necessária. Android Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Permissões de localização do jeito certo”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Android Academy?

Sim. Cada aula de Android Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Exibindo um mapa
  2. Obtendo a localização do usuário
  3. Marcadores e câmera
  4. Permissões de localização do jeito certo
← Voltar para Android Academy