Solicitar permissões especiais

Uma permissão especial protege o acesso a recursos do sistema que são particularmente sensíveis ou diretamente relacionados à privacidade do usuário. Essas permissões são diferentes das permissões no momento de instalação e das permissões de execução.

Figura 1. A tela Acesso especial para apps nas configurações do sistema.

Confira alguns exemplos de permissões especiais:

  • Programar alarmes exatos.
  • Exibir e sobrepor outros apps.
  • Acessar todos os dados de armazenamento.

Os apps que declaram uma permissão especial são mostrados na página Acesso especial para apps nas configurações do sistema (Figura 1). Para conceder uma permissão especial ao app, o usuário precisa acessar esta página: Configurações > Apps > Acesso especial para apps.

Fluxo de trabalho

Para solicitar uma permissão especial, siga estas etapas:

  1. No arquivo de manifesto do app, declare as permissões especiais que o app pode precisar solicitar.
  2. Projete a UX do app para que ações específicas sejam associadas a permissões especiais específicas. Informe aos usuários quais ações podem exigir que eles concedam permissão para que o app acesse dados particulares.
  3. Espere o usuário invocar a tarefa ou ação que exige acesso a dados particulares específicos. Nesse momento, o app pode solicitar a permissão especial necessária para acessar esses dados.
  4. Confira se o usuário já concedeu a permissão especial que o app precisa. Para isso, use a função de verificação personalizada de cada permissão. Se ele tiver concedido, seu app vai poder acessar os dados particulares do usuário. Caso contrário, continue para a próxima etapa. Observação: você precisa verificar se tem a permissão sempre que fizer uma operação que requer essa permissão.
  5. Apresente uma justificativa em um elemento da interface que informe explicitamente quais dados o app está tentando acessar e quais benefícios ele pode oferecer ao usuário se ele conceder a permissão especial. Além disso, como seu app envia os usuários às configurações do sistema para conceder a permissão, inclua instruções breves que expliquem como fazer isso. A interface precisa fornecer uma opção clara para o usuário recusar a permissão. Depois que o usuário confirmar essa justificativa, siga para a próxima etapa.
  6. Solicite a permissão especial que seu app precisa para acessar os dados particulares do usuário. Isso provavelmente envolve uma intent na página correspondente nas configurações do sistema em que o usuário poderá conceder a permissão. Ao contrário das permissões de execução, não há uma caixa de diálogo pop-up para essa permissão.
  7. Verifique a resposta do usuário, mesmo que ele tenha negado a permissão especial, no método onResume().
  8. Se a permissão foi concedida, você pode acessar os dados particulares do usuário. Se a permissão foi negada, faça uma degradação suave da experiência no app para que ele funcione sem as informações protegidas pela permissão.
Figura 2. Fluxo de trabalho para declarar e solicitar permissões especiais no Android.

Solicitar permissões especiais

Ao contrário das permissões de execução, o usuário precisa conceder permissões especiais na página Acesso especial para apps das configurações do sistema. Os apps podem direcionar os usuários para lá usando uma intent, que pausa o app e abre a página de configurações correspondente para uma determinada permissão especial. Depois que o usuário retorna ao app, o sistema pode verificar se a permissão foi concedida na função onResume().

O exemplo de código a seguir mostra como solicitar a permissão especial SCHEDULE_EXACT_ALARMS aos usuários:

val alarmManager = getSystemService<AlarmManager>()!!
when {
   // if permission is granted, proceed with scheduling exact alarms…
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // ask users to grant the permission in the corresponding settings page
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

Exemplo de código para verificar a permissão e processar decisões do usuário em onResume():

override fun onResume() {
   // ...

   if (alarmManager.canScheduleExactAlarms()) {
       // proceed with the action (setting exact alarms)
       alarmManager.setExact(...)
   }
   else {
       // permission not yet approved. Display user notice and gracefully degrade
       your app experience.
       alarmManager.setWindow(...)
   }
}

Práticas recomendadas e dicas

As seções a seguir mostram algumas práticas recomendadas e considerações ao solicitar permissões especiais.

Cada permissão tem seu próprio método de verificação

As permissões especiais funcionam de maneira diferente das permissões de execução. Consulte a página de referência da API de permissões e use as funções de verificação de acesso personalizado para cada permissão especial. Exemplos incluem AlarmManager#canScheduleExactAlarms() para a permissão SCHEDULE_EXACT_ALARMS e Environment#isExternalStorageManager() para a permissão MANAGE_EXTERNAL_STORAGE.

Solicitar no contexto

Assim como fazem com as permissões de execução, os apps precisam solicitar permissões especiais no contexto quando o usuário faz uma ação específica que exige a permissão. Por exemplo, aguarde até que o usuário programe o envio de um e-mail em um horário específico para solicitar a permissão SCHEDULE_EXACT_ALARMS.

Explicar a solicitação

Mostre um motivo antes de redirecionar para as configurações do sistema. Como os usuários saem temporariamente do app para conceder permissões especiais, mostre uma interface antes de iniciar a intent na página Acesso especial para apps nas configurações do sistema. Essa interface precisa explicar por que o app precisa da permissão e como o usuário pode concedê-la na página de configurações.