Runtime Permission: quais tipos existem e princípio de funcionamento no Android

Autor: IT Sectr Publicado: 2026-05-20 Tempo de leitura: 8 min

Runtime Permission é um mecanismo de solicitação de permissões durante a execução do aplicativo, introduzido no Android 6.0 (API 23). Diferente da concessão de permissões na instalação, as runtime permissions permitem que o usuário conceda ou revogue o acesso a dados confidenciais (câmera, geolocalização, contatos) a qualquer momento. De acordo com Android Developers (2026), mais de 85% dos aplicativos no Google Play usam pelo menos uma runtime permission.

Pontos Principais

  • Runtime Permission é um mecanismo do Android que exige o consentimento explícito do usuário para acessar dados confidenciais.
  • Permissões perigosas são um grupo de permissões que exigem uma solicitação em tempo de execução (câmera, microfone, geolocalização, contatos).
  • Permissões normais são aprovadas automaticamente pelo sistema e não exigem solicitação em tempo de execução (INTERNET, ACCESS_NETWORK_STATE).
  • Permissões únicas são permissões de uma sessão, introduzidas no Android 11, revogadas automaticamente ao fechar o aplicativo.
  • shouldShowRequestPermissionRationale é um indicador que determina se é necessário mostrar uma explicação ao usuário antes da solicitação.

O que é Runtime Permission?

Runtime Permission é um modelo de segurança do Android no qual o aplicativo solicita acesso a dados confidenciais no momento em que essa funcionalidade é realmente necessária para o usuário. Antes do Android 6.0, todas as permissões eram concedidas na instalação do aplicativo, e o usuário não podia revogá-las sem desinstalar completamente o aplicativo.

Evolução do modelo de permissões do Android

Antes do Android 6.0, o usuário via uma lista de todas as permissões na instalação e podia aceitar todas ou recusar a instalação. Um estudo de 2015 mostrou que 87% dos usuários não leem a lista de permissões na instalação. O Android 6.0 introduziu as runtime permissions, dividindo as permissões em normais (automáticas) e perigosas (com solicitação). O Android 11 adicionou as permissões únicas — revogação automática ao fechar o aplicativo. O Android 13 introduziu o Photo Picker e as notificações push como runtime permissions independentes.

O iOS usa um modelo semelhante desde o iOS 10, onde o acesso à câmera, microfone e geolocalização é solicitado no primeiro uso. No entanto, o iOS não tem o conceito de “permissões normais” — cada permissão é solicitada explicitamente, e a recusa persiste até que o desenvolvedor solicite novamente através das configurações do sistema.

Como o Runtime Permission funciona no Android?

O Runtime Permission funciona através de um diálogo do sistema invocado pelo método requestPermissions() (AndroidX — ActivityResultLauncher). O sistema exibe um diálogo padrão com uma explicação, e o usuário escolhe “Permitir” ou “Negar”. Após a resposta, um callback é acionado onde o aplicativo processa a decisão do usuário.

Solicitação de permissão via ActivityResultLauncher

kotlin
private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    requestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
            if (isGranted) {
                startCamera()
            } else {
                showPermissionDeniedDialog()
            }
        }
}

private fun checkCameraPermission() {
    when {
        ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED -> {
            startCamera()
        }
        ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) -> {
            showRationaleDialog { requestPermissionLauncher.launch(Manifest.permission.CAMERA) }
        }
        else -> {
            requestPermissionLauncher.launch(Manifest.permission.CAMERA)
        }
    }
}

O método shouldShowRequestPermissionRationale retorna true se o usuário já negou a solicitação uma vez. Neste caso, é recomendado mostrar um diálogo explicando por que o aplicativo precisa da permissão, e só então solicitar novamente. Isso aumenta a probabilidade de consentimento do usuário em 30–40% (dados do Google I/O 2024).

Tipos de permissões no Android

O Android classifica todas as permissões em vários níveis de proteção: normais, perigosas, de assinatura e especiais. As permissões normais são concedidas automaticamente na instalação. As permissões perigosas exigem uma solicitação em tempo de execução. As permissões de assinatura estão disponíveis apenas para aplicativos assinados com o mesmo certificado.

Grupos de permissões perigosas

GrupoPermissõesAPI Level
CAMERACAMERAAPI 23+
LOCATIONACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, ACCESS_BACKGROUND_LOCATIONAPI 23+ (segundo plano — API 29+)
STORAGEREAD_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, READ_MEDIA_IMAGES (API 33+)API 23+ (alterações na API 33)
PHONEREAD_PHONE_STATE, CALL_PHONE, READ_CALL_LOGAPI 23+
MICROPHONERECORD_AUDIOAPI 23+
CONTACTSREAD_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTSAPI 23+
NOTIFICATIONSPOST_NOTIFICATIONSAPI 33+

As permissões especiais (SYSTEM_ALERT_WINDOW, WRITE_SETTINGS, MANAGE_EXTERNAL_STORAGE) exigem navegação adicional para as configurações do sistema através de Settings.ACTION_MANAGE_OVERLAY_PERMISSION. Essas permissões não podem ser solicitadas através do diálogo padrão do sistema e exigem uma ação explícita do usuário na tela de configurações.

Solicitação de permissões no Android 12+

O Android 12 introduziu mudanças significativas no modelo de runtime permissions. As permissões únicas permitem conceder acesso à câmera, microfone ou geolocalização apenas para uma sessão. Assim que o usuário fecha o aplicativo, a permissão é revogada automaticamente. Os indicadores de privacidade são indicadores verdes na barra de status que mostram quando um aplicativo está usando a câmera ou o microfone.

Lidando com permissões únicas

kotlin
// Android 12+ — tratamento de permissão única de localização
private fun checkLocationPermission() {
    val permissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->

        val fineLocationGranted = permissions[Manifest.permission.ACCESS_FINE_LOCATION]
        val coarseLocationGranted = permissions[Manifest.permission.ACCESS_COARSE_LOCATION]

        if (fineLocationGranted == true) {
            showUserLocation()
        } else {
            showLocationDisabledDialog()
        }
    }

    permissionLauncher.launch(
        arrayOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        )
    )
}

// Verificar se a permissão foi revogada pelo sistema (Android 12+)
class PermissionReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == Intent.ACTION_PERMISSION_REVOCATION) {
            handleRevokedPermission(intent.getStringExtra(Intent.EXTRA_REVOKED_PERMISSION))
        }
    }
}

O Android 13 adicionou a permissão POST_NOTIFICATIONS ao grupo perigoso, exigindo uma solicitação explícita para enviar notificações push. O Android 14 introduziu restrições à geolocalização em segundo plano: o aplicativo deve obter a aprovação explícita do usuário cada vez que solicitar localização em segundo plano. O Photo Picker (API 33+) substituiu a necessidade de READ_EXTERNAL_STORAGE para seleção de imagens.

Lidando com recusas do usuário

A recusa do usuário a uma solicitação de permissão é uma situação normal que deve ser tratada corretamente. Existem dois tipos de recusa: única (o usuário pressionou “Negar”) e permanente (o usuário selecionou “Não perguntar novamente”). No segundo caso, o diálogo do sistema não aparecerá mais, e o aplicativo deve redirecionar o usuário para as configurações do sistema.

Estratégia de tratamento de recusas

Após a primeira recusa, o aplicativo deve mostrar um diálogo de justificativa — sua própria explicação de por que a permissão é necessária. Se o usuário recusar novamente, o aplicativo deve redirecionar para a tela de configurações do aplicativo através de Settings.ACTION_APPLICATION_DETAILS_SETTINGS. O Material 3 recomenda usar PermissionRequestBottomSheet para uma UX mais natural.

É importante não bloquear completamente a funcionalidade do aplicativo em caso de recusa. Por exemplo, se o usuário recusou a geolocalização, o aplicativo deve oferecer a entrada manual de endereço. Para a câmera, permitir o upload de uma imagem da galeria. O Google recomenda sempre fornecer um mecanismo alternativo para todas as runtime permissions.

Recomendações de segurança

As runtime permissions não são apenas um mecanismo técnico, mas também um elemento de confiança do usuário no aplicativo. Solicitar uma permissão em um momento inadequado (por exemplo, na primeira inicialização) reduz significativamente a probabilidade de consentimento. O Google Play Store analisa a frequência e o contexto das solicitações de permissão: aplicativos com solicitações agressivas obtêm posições mais baixas na pesquisa.

Regras para solicitar permissões

Contexto — solicite a permissão imediatamente antes de executar a ação que a requer. Mínimo — solicite apenas as permissões realmente necessárias para o funcionamento do recurso. Transparência — explique ao usuário por que a permissão é necessária antes do diálogo do sistema. Revogação — inscreva-se em ACTION_PERMISSION_REVOCATION para lidar corretamente com a revogação de permissões em tempo de execução.

Para testar runtime permissions, use comandos adb: adb shell pm revoke <package> android.permission.CAMERA permite simular a revogação de permissão sem reinstalar o aplicativo. Espresso e UiAutomator suportam testes de diálogos de permissão através de GrantPermissionRule. A integração dessas ferramentas no pipeline de CI/CD é obrigatória para aplicativos com runtime permissions.

Auditoria de permissões no Google Play Console

O Google Play Console fornece uma seção de auditoria de permissões, onde os desenvolvedores podem ver com que frequência as permissões são solicitadas, qual porcentagem de usuários concede acesso e quais permissões foram revogadas. A análise desses dados ajuda a identificar solicitações ineficazes e otimizar a UX. Por exemplo, se menos de 40% dos usuários concedem geolocalização, considere revisar o momento da solicitação e adicionar uma justificativa mais convincente.

O uso do Android Vitals para monitorar ANR (Application Not Responding) relacionado a permissões também é crítico. Se uma solicitação de permissão for executada na thread principal ou o diálogo do sistema bloquear a UI, isso pode causar ANR em dispositivos lentos. Mova a verificação e solicitação de permissões para uma thread separada ou use corrotinas do Kotlin para manipulação assíncrona para evitar bloquear a interface do usuário.

Perguntas Frequentes

Como distinguir uma recusa única de uma permanente?

shouldShowRequestPermissionRationale retorna false em caso de recusa permanente (quando o usuário selecionou “Não perguntar novamente”). O método retorna true em caso de recusa única, permitindo mostrar um diálogo de justificativa. Se o método retornar false, a única opção é redirecionar o usuário para as configurações do sistema.

É possível solicitar várias permissões ao mesmo tempo?

Sim, o ActivityResultContracts.RequestMultiplePermissions permite solicitar um conjunto de permissões em uma única chamada. O sistema exibirá diálogos sequencialmente para cada permissão. Recomenda-se agrupar permissões logicamente relacionadas (por exemplo, CAMERA e RECORD_AUDIO para gravação de vídeo), mas não solicitar mais de 2–3 de cada vez.

Como as runtime permissions funcionam no Android TV e Wear OS?

O Android TV usa o mesmo modelo de runtime permissions com diálogos exibidos na tela da TV. O Wear OS versão 3+ suporta runtime permissions, mas os diálogos são exibidos no relógio. Para o Android Auto, todas as permissões são solicitadas no telefone, e o sistema do carro recebe as permissões já aprovadas através de uma conexão bridge.

Quais mudanças nas permissões são esperadas no Android 16?

De acordo com informações preliminares, o Android 16 introduz a “expiração de permissão” para permissões únicas com revogação automática após 24 horas. Requisitos mais rigorosos para localização em segundo plano e uma lista expandida de permissões perigosas para novas categorias (sensores ambientais, varredura Wi-Fi) também são esperados. Detalhes exatos aparecerão no terceiro trimestre de 2027.

Qual a diferença entre runtime permission no Android e no iOS?

O iOS não suporta “permissões normais” — cada permissão é solicitada explicitamente através de um diálogo do sistema. O usuário pode revogar a permissão a qualquer momento através das configurações. A principal diferença é que o iOS não verifica previamente o status da permissão através de um equivalente ao checkSelfPermission: o sistema exibe automaticamente um diálogo no primeiro acesso a uma API protegida.

Resumo

  • Runtime Permission é um mecanismo para solicitar dados confidenciais no momento do uso real, introduzido no Android 6.0.
  • Permissões perigosas exigem um diálogo explícito do sistema; permissões normais são aprovadas automaticamente.
  • Permissões únicas (Android 12+) são revogadas ao fechar o aplicativo, aumentando a privacidade do usuário.
  • shouldShowRequestPermissionRationale determina se houve uma recusa anterior e ajuda a escolher a estratégia de solicitação.
  • O Android 13 adicionou POST_NOTIFICATIONS como runtime permission; o Android 14 endureceu os requisitos de geolocalização em segundo plano.
  • O Photo Picker (API 33+) substitui a necessidade de READ_EXTERNAL_STORAGE para seleção de imagens.
  • Sempre forneça um plano alternativo em caso de recusa do usuário — uma maneira alternativa de inserir dados ou selecionar manualmente.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também