Como ganhar a confiança dos utilizadores com o novo Modelo de Permissões no Android

Google I/O é sempre uma loucura e como sempre a Google faz a demonstração de novas tecnologias dentre outras coisas interessantes, ja lançadas ou ainda por vir. IO 2015 foi um dos melhores que ja assisti(Sonho em participar pessoalmente) pela quantidade de coisas interessantes que foram anunciadas.

Uma dessas coisas interessantes anunciada foi o android M, agora conhecido como Marshmallow que ansiosamente espero pela versão final e que de preferência seja com o lançamento do novo Nexus 5X :).

Das novas funcionalidades e API’s anunciadas durante o IO, uma das que mais me chamou atenção foi o novo modelo de permissões para as aplicações no Android que irei falar mais abaixo neste post.

Para falar do modelo de permissões, vou começar pela vida antes deste que pode ser ilustrado com apenas uma figura:

Uma lista enorme de permissões que a app iria requisitar ao dispositivo, que mesmo sem entender o porque de exactamente elas estarem ali, se quiséssemos mesmo continuar com o processo e desfrutar do que a app oferece não havia uma outra opção se não aceitar. Com isto, vários casos e historias começaram a surgir sobre como estas aplicações com tanto poder sobre o dispositivo através das permissões iam colhendo os dados dos utilizadores sem que eles soubessem. Estas historias e casos levantaram vários debates sobre a segurança e a privacidade dos utilizadores que acredito que tenham sido um grande factor no impulsionamento do famoso modelo de permissões.

Mas então o que e este modelo de permissões?

O novo modelo de permissões de app é basicamente uma mudança no processo de instalação e upgrade das aplicações em que os utilizadores não precisam de garantir nenhuma permissão no processo de instalação da aplicação, o que significa que o Install no playstore passara finalmente a ser directamente “Install” sem ter de passar por uma imagem como na lista acima.

Para entender melhor este modelo e começar a implementar nas aplicações, é preciso falar sobre duas coisas que considero importantes:

  1. permission groups : todas as permissões estão divididas em grupos. Sim tão simples quanto isso. por exemplo a muito conhecida permission GET_ACCOUNTS utilizada quando queremos que a app possa ter acesso as Accounts do dispositivo encontra-se dentro da permission group CONTACTS juntamente com READ_CONTACTS e WRITE_CONTACTS.
  2. protection level: todas as permissões, tem níveis de protecção: normal em que estas não permitem aceder a informação confidencial do utilizador(permissão para aceder a camera — CAMERA) e dangerous em que quando garantidas é possível aceder a informação confidencial do utilizador(GET_ACCOUNTS, READ_SMS)

Para começar, temos de saber quais são as permissões que precisaremos na nossa app e implementar da seguinte forma:

Definir todas as permissões no Android Manifest: assim como temos vindo a fazer, devemos definir todas a permissões que utilizaremos no Androidmanifest.xm file da forma convencional :

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />

Pedir as permissões durante a execução quando precisamos: Como falei acima, antigamente bastava aceitar instalar a aplicação no playstore, a aplicação já tinha todas as permissões da lista garantidas. Com o novo modelo de permissões só são garantidas automaticamente todas as permissões ou grupo de permissões que tem o nível de protecção NORMAL. Para os grupos ou permissões com o nível de permissão DANGEROUS, é preciso explicitamente pedir que o user autorize durante a execução da app seguindo os seguintes passos:

  1. Verificar se a permissão ja foi garantida: Utilizando o método checkSelfPermission da classe AppCompat na support library v23.0.0 verificamos se o utilizador ja garantiu uma permissão:
if(ActivityCompat.checkSelfPermission(getActivity(),Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
//Pedimos as permissoes
} else {
//continuamos a fazer o que queríamos pois a permissão ja foi garantida
}

Se esta condição for falsa, fazemos o que pretendíamos pois o utilizador ja garantiu a permissão.

2. Fazer o pedido de permissão ao utilizador: O pedido de permissão é realizado no caso em que na verificação feita no passo anterior indique que a permissão não foi garantida.Para fazer o pedido de permissão ao utilizador basta só utilizar o método requestPermission disponível nas Activities e Fragments na versão v 23.0.0 da AppCompat support library em apenas uma linha como esta

requestPermissions(new String[]{Manifest.permission.GET_ACCOUNTS,Manifest.permission.GET_ACCOUNTS_PRIVILEGED}, PERM_RC);

em que passamos ao pedido uma ou mais permissões que queremos pedir autorização e um inteiro que identifica este pedido. Ao executar esta linha de código o utilizador é apresentado uma mensagem em uma caixa de dialogo pedido que garanta ou não a permissão.

Caso o utilizador garanta a permissão, a aplicação terá a permissão que pediu e poderá fazer todas as operações que precisa. É importante dizer que ao fazer o request permission a permissão será garantida e nada mais acontecerá. Para explicitamente continuar com o que pretendíamos fazer antes de ter a permissão logo que ela nos é garantida, temos de implementar dentro da nossa Activity ou Fragment o método onRequestPermissionResult que é executado assim que o sistema envia a resposta sobre o pedido de permissão realizado. Assim como o onActivityResult em que identificamos a activity que respondeu pelo request code enviado ao inicia-la, como disse acima também identificamos o a resposta pelo código que passamos no pedido de permissão. Exemplo:

@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch(requestCode){
case PERM_RC:{
if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
//Continuamos com a operação que pretendíamos
            }
break;
}
}
}

A implementação deste processo de verificação e pedido durante a execução é importante pois mesmo após garantir que a aplicação tenha uma certa permissão, o utilizador pode ir as definições da aplicação e manualmente desabilitar as permissões.

De forma muito simples, este pequeno texto é o básico sobre a implementação deste novo modelo de permissões para as apps. Ao começar a desenvolver para o android Marshmallow é importante pensar não só na implementação técnica como falei aqui mas em questões de UI/UX como por exemplo requisitar as permissões só quando necessárias e explicar devidamente o utilizador sobre a necessidade de obter a permissão.

Assim cheguei ao fim do post e caso tenham gostado, comentem abaixo e partilhem com um amigo :)