Permissões de localização do jeito certo
Localização em primeiro plano e precisa.
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.
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
- Exibindo um mapa
- Obtendo a localização do usuário
- Marcadores e câmera
- Permissões de localização do jeito certo