Dev (Back & Front)ARTIGO

Mobilidade é tudo – Android 6.0 e a Política de Permissões

Veja uma análise sobre o impacto da política de permissões no Android 6.0.

O Android 6.0 (Marshmallow) é a mais recente atualização da plataforma. Assim como aconteceu nas versões anteriores, o números de novas features, frameworks e possibilidades aumentou consideravelmente. Uma delas em especial tem chamado a minha atenção. A nova política de requisição de permissões em tempo de execução.

O impacto dessa mudança será sentido à medida que a nova versão da plataforma começar a ganhar mercado. Segundo dados do início do mês de agosto de 2015, a fatia que o Marshmallow já abocanhou ainda é bem tímida: apenas 0,3%.

A primeira mudança de conceito está na ideia de permissões normais e permissões perigosas. Ou, no bom e velho inglês, normal permission e dangerous permission. O primeiro tipo indica as permissões que não causam riscos diretos de privacidade ao usuário, enquanto que o segundo (as perigosas) pode causar.

Alguns exemplos de dangerous permission: READ_CALENDAR, READ_CONTACTS, CALL_PHONE, SEND_SMS, READ_SMS. Alguns exemplo de normal permission: FLASHLIGHT, TRANSMIT_IR, INTERNET, VIBRATE, USE_FINGERPRINT e SET_TIME_ZONE.

Diferentemente das versões anteriores, nas quais todas as permissões eram configuradas no AndroidManifest.xml e o usuário as aceitava no momento da instalação da aplicação, agora o Android já aceita por padrão as normal permissions e pede permissão de uso ao usuário a cada momento em que uma dangerous permission seja utilizada.

O primeiro grande cuidado é checar a permissão dada pelo usuário no momento de usar uma permissão. Mesmo que a revogação não tenha ocorrido dentro do app, é possível, no Android Marshmallow, acessar as preferências de um aplicativo e mudar completamente as permissões.

Com a biblioteca de compatibilidade do Android, é possível usar o método checkSelfPermission da classe ContextCompat. Como parâmetro do método é passada a permissão que desejamos checar.

int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);

Os dois retornos possíveis são: PackageManager.PERMISSION_GRANTED e PERMISSION_DENIED. No primeiro caso, temos permissão de uso e a aplicação pode proceder normalmente. Já no segundo caso, o usuário negou a permissão e o código deve ser suficientemente inteligente para fornecer outra feature ou tratar de maneira adequada a falta desse “recurso”.

Se a aplicação não tiver permissão de uso de uma feature, o próximo passo lógico é requisitá-la ao usuário. A imagem abaixo mostra o diálogo que será mostrado ao efetuarmos essa operação. O diálogo não é customizável:

request_permission_dialog_2x

E se o usuário já tiver negado essa mesma requisição? Ou, ainda, e se a permissão não for tão clara dentro do contexto de uso da aplicação? Em ambos os casos, o desenvolvedor pode programar uma view ou mostrar o seu próprio diálogo antes de fazer a requisição. E para responder à primeira pergunta, temos o método shouldShowRequestPermissionRationale(), que retornará true se a requisição já foi apresentada e negada previamente.

Para requisitar a permissão, usamos o método requestPermission da classe ActivityCompat. Os três parâmetros são: contexto, permissões desejadas e um request code que será recebido no retorno da resposta do usuário.

ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_REQUEST_CODE);

Para saber a resposta do usuário, basta sobrescrever o método onRequestPermissionsResult da Activity. Perceba que o primeiro parâmetro recebido é justamente o request code.

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_REQUEST_CODE: {
            // se a request for cancelada o grantResult vem vazio
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permissão dada pelo usuário
            } else {
                // permissão negada pelo usuário
            }
            return;
        }
    }
}

Graças à API de compatibilidade, podemos deixar transparente essa mudança de paradigma para o usuário. Basta fazer a nossa parte :).

***

Texto publicado originalmente na Revista iMasters.

Ricardo da Silva Ogliari é co-autor do livro "Android: do Básico ao Avançado" e de mais de 350 publicações. Bacharelado em Ciência da Computação, especialista em Web: Estratégias de Inovação e eTecnologia, tem MBA em Desenvolvimento de Jogos e Aplicativos Móveis. É co-fundador do Things Hacker Team. Eleito um dos 10 nomes do Open Hardware em 2013.

Ver perfil