Solicitando permissões no Compose
Use as APIs do Accompanist ou de resultados de atividades.
Solicitando permissões no Compose é uma aula grátis de Android Academy no CoddyKit. Esta é a aula 2 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.
Solicitação no Compose
No Jetpack Compose, você solicita permissões em tempo de execução usando a API de resultados de atividades, encapsulada por rememberLauncherForActivityResult. Isso evita o callback antigo onRequestPermissionsResult.
O contrato RequestPermission
A API de resultados de atividades usa contratos que definem a entrada e a saída. ActivityResultContracts.RequestPermission() recebe uma string de permissão e retorna um resultado Boolean de concessão.
Criando um inicializador
rememberLauncherForActivityResult cria um inicializador associado à composição. Você passa o contrato e um callback que recebe o resultado.
val launcher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
// permission granted, use the feature
} else {
// permission denied
}
}Iniciando a solicitação
Chame launcher.launch com a permissão desejada. O sistema exibirá a caixa de diálogo, e seu callback será acionado com a escolha do usuário.
Button(onClick = {
launcher.launch(Manifest.permission.CAMERA)
}) {
Text("Enable Camera")
}Verifique antes de solicitar
Não inicie uma solicitação às cegas. Primeiro verifique se a permissão já foi concedida e só a solicite se não tiver sido.
val context = LocalContext.current
val alreadyGranted = ContextCompat.checkSelfPermission(
context, Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTEDAcompanhando o estado no Compose
Mantenha o status atual da concessão em um estado para que a interface possa reagir. Atualize-o dentro do callback do inicializador.
var hasCamera by remember {
mutableStateOf(
ContextCompat.checkSelfPermission(
context, Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED
)
}
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted -> hasCamera = granted }Solicitando várias permissões
Para várias permissões de uma vez, use o contrato RequestMultiplePermissions. O callback recebe um mapa de permissões e seus status de concessão.
val multi = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { results ->
val fineLocation = results[Manifest.permission.ACCESS_FINE_LOCATION] == true
}
multi.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)Controlando a interface pelo estado
Exiba conteúdos diferentes com base no estado da concessão: se a permissão tiver sido concedida, mostre o recurso; caso contrário, mostre um botão para solicitá-la. Assim, a tela permanece reativa e clara.
if (hasCamera) {
CameraPreview()
} else {
Button(onClick = { launcher.launch(Manifest.permission.CAMERA) }) {
Text("Grant camera access")
}
}A opção de permissões do Accompanist
A biblioteca Accompanist Permissions oferece auxiliares de nível mais alto, como rememberPermissionState. Muitas equipes preferem a API de resultados de atividades diretamente para evitar uma dependência adicional; ambas as opções são válidas.
Não solicite ao iniciar
Evite disparar uma solicitação de permissão no instante em que uma tela aparece. Aguarde até que o usuário toque em uma ação que claramente precise dela. Solicitações feitas no contexto certo obtêm taxas de concessão muito maiores.
Lembre-se das mudanças de configuração
rememberLauncherForActivityResult sobrevive à recomposição, e a estrutura de resultados de atividades entrega os resultados corretamente mesmo durante mudanças de configuração, como a rotação. Você não precisa gerenciar essa infraestrutura.
Verificação rápida
Teste sua compreensão da solicitação de permissões.
Recapitulação
Você solicitou permissões da maneira moderna:
- Use
rememberLauncherForActivityResultcom o contratoRequestPermission - Verifique primeiro e depois use
launcher.launch(permission) - Acompanhe o status da concessão em um estado para controlar a interface
- Use
RequestMultiplePermissionspara várias permissões de uma vez
A seguir: como lidar com recusas e exibir uma justificativa.
Perguntas Frequentes
A aula “Solicitando permissões no Compose” é grátis?
Sim — o texto completo de “Solicitando permissões no Compose” é 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 “Solicitando permissões no Compose”?
Use as APIs do Accompanist ou de resultados de atividades. 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 2 de 4.
Quanto tempo leva a aula “Solicitando permissões no Compose”?
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
- O modelo de permissões do Android
- Solicitando permissões no Compose
- Lidando com recusas e justificativas
- Práticas recomendadas de privacidade