Práticas recomendadas de permissões do app

As solicitações de permissão protegem informações confidenciais disponíveis em um dispositivo e só podem ser usadas quando o acesso a informações é necessário para o funcionamento do app. Este documento fornece dicas sobre como você pode conseguir a mesma funcionalidade (ou uma melhor) sem precisar acessar essas informações. Esta não é uma discussão completa sobre como as permissões funcionam no sistema operacional Android.

Para uma perspectiva mais geral das permissões do Android, consulte a Visão geral das permissões. Para ver detalhes sobre como trabalhar com permissões no seu código, consulte Solicitar permissões do app.

Permissões no Android 6.0 e em versões mais recentes

O Android 6.0 Marshmallow introduziu um novo modelo de permissões que permite aos apps solicitar permissões do usuário no tempo de execução, em vez de antes da instalação. Os apps compatíveis com o novo modelo solicitam permissões quando de fato precisam dos serviços ou dos dados protegidos pelos serviços. Embora isso não (necessariamente) mude o comportamento geral do app, foram feitas algumas mudanças relevantes na forma de processamento dos dados confidenciais do usuário:

Aumento no contexto situacional: os usuários recebem uma solicitação no tempo de execução, no contexto do app, para concederem permissão de acesso à função incluída nesses grupos de permissões. Os usuários estão mais atentos ao contexto em que a permissão é solicitada e, em caso de incompatibilidade entre a solicitação e o propósito do app, é ainda mais importante fornecer explicações detalhadas sobre o motivo da solicitação de permissão. Sempre que possível, forneça uma explicação no momento da solicitação e em uma caixa de diálogo de acompanhamento se o usuário a negar.

Maior flexibilidade na concessão de permissões: os usuários podem negar o acesso a permissões individuais no momento da solicitação e nas configurações. No entanto, eles ainda podem se surpreender caso uma função seja inutilizada como resultado dessa recusa. É recomendável monitorar quantos usuários estão negando permissões (por exemplo, usando o Google Analytics) para que você possa refatorar seu app dependendo da permissão ou fornecer uma explicação melhor sobre a necessidade da permissão para o funcionamento adequado do app. Certifique-se também de que seu app processe as exceções criadas quando os usuários negam solicitações de permissão ou desativam as permissões nas configurações.

Aumento da carga de transações: é solicitado aos usuários que concedam acesso para grupos de permissões individualmente, e não como um conjunto. Dessa forma, é extremamente importante minimizar o número de permissões solicitadas, já que isso aumenta o trabalho do usuário em conceder permissões e a probabilidade de pelo menos uma delas ser negada.

Permissões que precisam se tornar um gerenciador padrão

Alguns apps dependem do acesso a informações confidenciais do usuário relacionadas a registros de chamadas e mensagens SMS. Se você quiser solicitar permissões especificamente para registros de chamadas e mensagens SMS e publicar seu app na Play Store, precisará solicitar que o usuário configure seu app como o gerenciador padrão de uma função principal do sistema antes de solicitar essas permissões de execução.

Para ver mais informações sobre gerenciadores padrão, incluindo orientações sobre como mostrar uma solicitação de gerenciador padrão para o usuário, consulte o guia sobre permissões usadas somente em gerenciadores padrão.

Conheça as bibliotecas com que está trabalhando

Às vezes, as bibliotecas usadas no seu app exigem permissões. Por exemplo, as bibliotecas de anúncios e de análise podem exigir acesso ao grupo de permissões LOCATION para implementar a função necessária. Contudo, do ponto de vista do usuário, a solicitação de permissão é enviada do seu app, não da biblioteca.

Assim como os usuários selecionam apps que usam menos permissões para as mesmas funções, os desenvolvedores precisam analisar as bibliotecas e selecionar SDKs de terceiros que não usem permissões desnecessárias. Por exemplo, se você está usando uma biblioteca que oferece a função de localização, não solicite a permissão FINE_LOCATION, a não ser que você esteja usando funções de segmentação baseadas na localização.

Limite o acesso em segundo plano à localização

Quando seu app é executado em segundo plano, o acesso à localização precisa ser fundamental para a funcionalidade principal do app e mostrar um benefício claro para os usuários.

Explique por que as permissões são necessárias

A caixa de diálogo de permissões exibida pelo sistema ao chamar requestPermissions() informa quais permissões o app solicita, mas não explica o motivo. Em alguns casos, o usuário pode achar isso confuso. É recomendável explicar ao usuário por que as permissões são necessárias para o app antes de chamar requestPermissions().

Pesquisas mostram que os usuários se sentem muito mais à vontade com solicitações de permissões quando sabem por que o app precisa delas. Um estudo com usuários revelou que:

...a disposição de um usuário de conceder determinada permissão a um app para dispositivos móveis é fortemente influenciada pelo propósito associado a essa permissão. Por exemplo, a disposição de um usuário de permitir o acesso à localização varia de acordo com o motivo da solicitação: se ela é necessária para ter compatibilidade com uma funcionalidade principal do app ou se é usada para compartilhar a informação com uma rede de publicidade ou empresa de análise.1

Depois de colaborar com outras pessoas em pesquisas sobre esse assunto, o Professor Jason Hong da CMU concluiu que, de forma geral:

… quando as pessoas sabem por que um app está usando uma informação tão confidencial quanto a localização, por exemplo, para anúncios segmentados, elas ficam mais à vontade do que ficariam ao serem simplesmente informadas sobre esse uso.1

Consequentemente, se você só estiver usando uma fração das chamadas de API que se encaixam em um grupo de permissões, será relevante listar de maneira explícita quais permissões estão sendo usadas e o porquê. Exemplo:

  • Se você só estiver usando a localização aproximada, informe isso ao usuário na descrição do app ou em artigos de ajuda sobre ele.
  • Se você precisar de acesso a mensagens SMS para receber códigos de autenticação que protejam o usuário contra fraude, informe isso na descrição do app e/ou na primeira vez que acessar os dados.

    Observação: se o app for destinado ao Android 8.0 (API de nível 26) ou versões mais recentes, não solicite a permissão READ_SMS como parte da verificação das credenciais do usuário. Em vez disso, gere um token específico do app usando createAppSpecificSmsToken() e transmita esse token para outro app ou serviço que possa enviar uma mensagem SMS de verificação.

Em certas condições, também é pertinente informar os usuários sobre acessos a dados confidenciais em tempo real. Por exemplo, caso você esteja acessando a câmera ou o microfone, geralmente é recomendável informar o usuário com um ícone de notificação em algum lugar do app ou na bandeja de notificações (se o aplicativo estiver sendo executado em segundo plano) para que não pareça que os dados estão sendo coletados clandestinamente.

Por fim, se você precisar solicitar permissão para que um recurso do seu app seja executado, mas o motivo não estiver claro para o usuário, encontre uma maneira de informar por que você precisa das permissões mais confidenciais.

Teste os dois modelos de permissões

A partir do Android 6.0 (API de nível 23), os usuários concedem e revogam permissões do app durante a execução, não no momento da instalação. Por isso, é preciso testar seu app em condições variadas. Antes do Android 6.0, você podia presumir que, se o app estivesse em execução, ele tinha todas as permissões declaradas no próprio manifesto. A partir do Android 6.0, o usuário pode ativar ou desativar as permissões para qualquer app, inclusive apps destinados à API de nível 22 ou anterior. Você precisa testar para garantir que seu app funcione corretamente, independentemente de ter ou não permissões concedidas.

As dicas a seguir ajudarão você a encontrar problemas de código relacionados a permissões em dispositivos com o nível de API 23 ou superior:

  • Identifique as permissões atuais do aplicativo e os caminhos de código relacionados.
  • Teste o fluxo de usuários entre serviços e dados protegidos por permissão.
  • Teste várias combinações de permissões concedidas ou revogadas. Por exemplo, um app de câmera pode listar CAMERA, READ_CONTACTS e ACCESS_FINE_LOCATION no manifesto. É preciso testar o app com cada uma dessas permissões ativadas e desativadas para garantir que ele possa processar todas as configurações de permissão corretamente.
  • Use a ferramenta adb para gerenciar permissões pela linha de comando:
    • Liste as permissões e os status por grupo:
      $ adb shell pm list permissions -d -g
    • Conceda ou revogue uma ou mais permissões:
      $ adb shell pm [grant|revoke] <permission-name> ...
  • Analise o aplicativo para descobrir os serviços que usam permissões.

Outros recursos

Referências

[1] Modeling Users’ Mobile App Privacy Preferences: Restoring Usability in a Sea of Permission Settings, de J. Lin B. Liu, N. Sadeh and J. Hong. Nos procedimentos do SOUPS 2014.