page.title=Permissões page.tags=previewresources, androidm page.keywords=permissions, runtime, preview page.image={@docRoot}preview/images/permissions_check.png @jd:body

Visualização rápida

Neste documento

  1. Visão geral
  2. Codificação para permissões de tempo de execução
  3. Teste de permissões de tempo de execução
  4. Práticas recomendadas

O M Developer Preview introduz um novo modelo de permissões de aplicativo que agiliza o processo de instalação e atualização de aplicativos para os usuários. Se um aplicativo que está sendo executado no M Preview suporta o novo modelo de permissões, o usuário não precisa conceder permissões ao instalar ou atualizar o aplicativo. Em vez disso, o aplicativo solicita as permissões à medida que precisar e o sistema exibe um diálogo ao usuário pedindo a permissão.

Se um aplicativo suportar o novo modelo de permissões, ele ainda poderá ser instalado e executado em versões mais antigas do Android, usando o antigo modelo de permissões nesses dispositivos.

Visão geral

Com o M Developer Preview, a plataforma introduz um novo modelo de permissões. Eis um resumo dos componentes essenciais deste novo modelo:

Este modelo de permissões altera a forma como o aplicativo se comporta diante os recursos que precisam de permissões. Eis um resumo das práticas de desenvolvimento que devem ser seguidas para ajustar para este modelo:

Observação: se um aplicativo direcionar o M Developer Preview, ele deve usar o novo modelo de permissões.

No momento do lançamento do M Developer Preview, nem todos os aplicativos Google implementam completamente o novo modelo de permissões. A Google está atualizando estes aplicativos durante o curso do M Developer Preview para respeitar adequadamente a configuração de alternação de permissões.

Observação: se o aplicativo tiver a própria superfície de API, não represente permissões sem antes garantir que o autor da chamada tenha as permissões necessárias para acessar esses dados.

Permissões de assinatura e aplicativos do sistema

Geralmente, quando um usuário instala um aplicativo, o sistema somente fornece ao aplicativo o {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}. No entanto, sob algumas circunstâncias, o sistema concede ao aplicativo mais permissões:

Em ambos os casos, o usuário ainda pode revogar as permissões a qualquer momento acessando a tela de configurações do sistema e escolhendo Aplicativos > app_name > Permissões. O aplicativo deve continuar com a verificação das permissões no tempo de execução e solicitá-las se necessário.

Compatibilidade anterior e posterior

Se um aplicativo não direciona para o M Developer Preview, ele deve continuar a usar o modelo antigo de permissões mesmo nos dispositivos M Preview. Quando o usuário instala o aplicativo, o sistema pede para que ele conceda todas as permissões listadas no manifesto do aplicativo.

Observação: em dispositivos que são executados no M Developer Preview, um usuário pode desativar as permissões para qualquer aplicativo (incluindo aplicativos de legado) na tela de configurações do aplicativo. Se um usuário desativa as permissões de um aplicativo de legado, o sistema silenciosamente desativa a funcionalidade adequada. Quando um aplicativo tentar realizar uma operação que requer esta permissão, a operação não necessariamente causará uma exceção. Em vez disso, ele retornará um conjunto de dados vazio, sinalizará um erro ou exibirá um comportamento inesperado. Por exemplo, caso queira consultar um calendário sem permissão, o método retorna um conjunto de dados vazio.

Se instalar um aplicativo usando o novo modelo de permissões em um dispositivo que não está executando o M Preview, o sistema o tratará da mesma forma que qualquer outro aplicativo: o sistema pedirá para que o usuário conceda todas as permissões declaradas no momento da instalação.

Observação: para a liberação de prévia, deve-se definir a versão mínima de SDK para o M Preview SDK para compilar com o SDK de prévia. Isto significa que você não poderá testar tais aplicativos em plataformas mais antigas durante a prévia de desenvolvedor.

Permissões versus intenções

Em vários casos, é possível escolher entre duas maneiras para que o aplicativo realize uma tarefa. É possível fazer com que o aplicativo solicite uma permissão para realizar a operação por conta própria. Alternativamente, é possível fazer com que o aplicativo use uma intenção para que outro aplicativo realize a tarefa.

Por exemplo, imagine que o aplicativo precisa da função de tirar fotos com a câmera do dispositivo. O aplicativo pode solicitar a permissão android.permission.CAMERA, que permite que ele acesse a câmera diretamente. O aplicativo então usará as APIs da câmera para controlar a câmera e tirar uma foto. Esta abordagem fornece ao aplicativo controle completo sobre o processo de fotografia e permite que você incorpore a IU da câmera.

No entanto, caso não precise de tal controle, é possível apenas usar uma intenção {@link android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} para solicitar uma imagem. Ao iniciar a intenção, o usuário deve escolher um aplicativo de câmera (se não houver um aplicativo padrão de câmera) para tirar a foto. O aplicativo da câmera retorna a imagem ao método {@link android.app.Activity#onActivityResult onActivityResult()} do aplicativo.

De forma semelhante, caso precise realizar uma ligação, acessar os contatos do usuário etc., é possível fazer estas ações criando uma intenção adequada ou solicitar a permissão e o acesso aos objetos adequados diretamente. Essas são as vantagens e desvantagens de cada abordagem.

Se usar permissões:

Se usar uma intenção:

Codificação para permissões de tempo de execução

Se um aplicativo direciona o novo M Developer Preview, ele deve usar o novo modelo de permissões. Isto significa que, além de declarar as permissões necessárias no manifesto, deve-se também verificar se o aplicativo tem as permissões no tempo de execução e, caso ainda não as tenha, solicitá-las.

Possibilitar um novo modelo de permissões

Para possibilitar o modelo de permissões do M Developer Preview, configure o atributo targetSdkVersion do aplicativo para "MNC" e compileSdkVersion para "android-MNC". Isto ativará todos os novos recursos de permissão.

Para a liberação de uma prévia, deve-se definir minSdkVersion para "MNC" para compilar com o SDK de prévia.

Designar uma permissão somente para o M Preview

É possível usar o novo elemento <uses-permission-sdk-m> no manifesto do aplicativo para indicar que uma permissão é necessária apenas no M Developer Preview. Se você declarar uma permissão desta maneira, sempre que o aplicativo for instalado em um dispositivo mais antigo, o sistema não solicitará ao usuário nem concederá a permissão ao aplicativo. Usando o elemento <uses-permission-sdk-m> , é possível adicionar novas permissões a versões atualizadas do aplicativo sem forçar os usuários a conceder permissões ao instalar a atualização.

Se o aplicativo está sendo executado em um dispositivo com M Developer Preview, o <uses-permission-sdk-m> se comporta da mesma forma que <uses-permission>. O sistema não solicita ao usuário que conceda quaisquer permissões ao instalar o aplicativo e o aplicativo solicita as permissões à medida que forem necessárias.

Solicitação de permissões

Se o aplicativo usa o novo modelo de permissões do M Developer Preview, o usuário não recebe solicitações para conceder todas as permissões quando o aplicativo é iniciado pela primeira vez em um dispositivo que está sendo executado no M Preview. Em vez disso, o aplicativo solicita as permissões à medida que forem necessárias. Quando um aplicativo solicita uma permissão, o sistema exibe uma caixa de diálogo ao usuário.

Se o aplicativo executar em um dispositivo que tem SDK 22 ou inferior, ele usará o antigo modelo de permissões. Quando o usuário instala o aplicativo, ele é solicitado a conceder todas as permissões que o aplicativo lista no manifesto, exceto as permissões que forem marcadas com <uses-permission-sdk-m>.

Verifique em qual plataforma o aplicativo está sendo executado

Este modelo de permissões é suportado apenas em dispositivos que estão executando o M Developer Preview. Antes de chamar qualquer um destes métodos, o aplicativo deve verificar em qual plataforma está sendo executado verificando o valor de {@link android.os.Build.VERSION#CODENAME Build.VERSION.CODENAME}. Se o dispositivo estiver sendo executado no M Developer Preview, {@link android.os.Build.VERSION#CODENAME CODENAME} será "MNC".

Verifique se o aplicativo tem a permissão necessária

Quando o usuário tenta fazer algo que requer uma permissão, o aplicativo verifica se tem a permissão para realizar esta operação. Para fazer isto, o aplicativo chama Context.checkSelfPermission(permission_name). O aplicativo deve realizar isto para verificar se sabe que o usuário já concedeu esta permissão, levando em consideração que o usuário pode revogar as permissões do aplicativo a qualquer momento. Por exemplo, se um usuário quiser usar um aplicativo para tirar uma foto, o aplicativo chamará Context.checkSelfPermission(Manifest.permission.CAMERA).

Tabela 1. Permissões e grupos de permissões.

Grupo de permissões Permissões
android.permission-group.CALENDAR
  • android.permission.READ_CALENDAR
  • android.permission.WRITE_CALENDAR
android.permission-group.CAMERA
  • android.permission.CAMERA
android.permission-group.CONTACTS
  • android.permission.READ_CONTACTS
  • android.permission.WRITE_CONTACTS
  • android.permission.READ_PROFILE
  • android.permission.WRITE_PROFILE
android.permission-group.LOCATION
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.ACCESS_COARSE_LOCATION
android.permission-group.MICROPHONE
  • android.permission.RECORD_AUDIO
android.permission-group.PHONE
  • android.permission.READ_PHONE_STATE
  • android.permission.CALL_PHONE
  • android.permission.READ_CALL_LOG
  • android.permission.WRITE_CALL_LOG
  • com.android.voicemail.permission.ADD_VOICEMAIL
  • android.permission.USE_SIP
  • android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.SENSORS
  • android.permission.BODY_SENSORS
  • android.permission.USE_FINGERPRINT
android.permission-group.SMS
  • android.permission.SEND_SMS
  • android.permission.RECEIVE_SMS
  • android.permission.READ_SMS
  • android.permission.RECEIVE_WAP_PUSH
  • android.permission.RECEIVE_MMS
  • android.permission.READ_CELL_BROADCASTS

Solicitar permissões se necessário

Se o aplicativo já não tem a permissão necessária, ele chama o método Activity.requestPermissions(String[], int) para solicitar as permissões necessárias. O aplicativo passa as permissões que deseja e também um "código de solicitação" do inteiro. Este método funciona de forma assíncrona: ele retorna imediatamente e, depois que o usuário responde à caixa de diálogo, o sistema chama o método de retorno de chamada do aplicativo com os resultados, passando o mesmo "código de solicitação" que o aplicativo passou para requestPermissions().

O seguinte código verifica se o aplicativo tem a permissão para ler os contatos do usuário e solicita a permissão, se necessário:

if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
    // app-defined int constant

    return;
}

Lidar com a resposta de solicitação das permissões

Quando um aplicativo solicita as permissões, o sistema apresenta uma caixa de diálogo ao usuário. Quando o usuário responde, o sistema invoca o Activity.onRequestPermissionsResult(int, String[], int[]) do aplicativo, passando a ele a resposta do usuário. O aplicativo precisa substituir este método. O retorno de chamada recebe o mesmo código de solicitação passado para requestPermissions(). Por exemplo, se um aplicativo solicita o acesso READ_CONTACTS, ele pode ter o seguinte método de retorno de chamada:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! do the
                // calendar task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'switch' lines to check for other
        // permissions this app might request
    }
}

Se o usuário concede a permissão, o sistema fornece ao aplicativo todas as permissões que o manifesto do aplicativo lista para esta área funcional. Se o usuário negar a solicitação, deve-se tomar a ação adequada. Por exemplo, deve-se desativar quaisquer ações de menu que dependam desta permissão.

Quando o sistema pede para que o usuário conceda uma permissão, esse usuário tem a opção de dizer ao sistema para que não peça esta permissão novamente. Nesse caso, quando um aplicativo usa requestPermissions() para solicitar esta permissão, o sistema nega imediatamente. Neste caso, o sistema chama onRequestPermissionsResult() da mesma forma que faria se o usuário tivesse rejeitado explicitamente a solicitação novamente. Por este motivo, o aplicativo não pode presumir que uma interação direta com o usuário ocorreu.

Teste de permissões de tempo de execução

Se o aplicativo for direcionado para o M Developer Preview, deve-se testar se ele lida com as permissões corretamente. Não se pode presumir que o aplicativo terá qualquer permissão quando executado. Quando o aplicativo é iniciado pela primeira vez, é provável que não tenha permissões. O usuário pode revogar e restaurar permissões a qualquer momento.

Deve-se testar o aplicativo para garantir que ele se comporte corretamente em todas as situações de permissão. Com o M Preview SDK, fornecemos os novos comandos de Android Debug Bridge (adb) para possibilitar que o aplicativo seja testado com quaisquer configurações de permissões necessárias.

Novas opções e comandos adb

As ferramentas da plataforma M Preview SDK fornecem vários comandos novos para permitir que você teste como o aplicativo lida com permissões.

Instalar com permissões

É possível usar a nova opção -g do comando adb install, que instala o aplicativo e fornece todas as permissões listadas em seu manifesto:

$ adb install -g <path_to_apk>

Conceder e revogar permissões

É possível usar os novos comandos do gerenciador de pacotes (pm) de ADB para conceder e revogar as permissões de um aplicativo instalado. Esta funcionalidade pode ser útil para testes automatizados.

Para conceder uma permissão, use o comando grant do gerenciador de pacote:

$ adb pm grant <package_name> <permission_name>

Por exemplo: para conceder a permissão do pacote com.example.myapp para gravar áudios, use este comando:

$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO

Para revogar uma permissão, use o comando revoke do gerenciador de pacote:

$ adb pm revoke <package_name> <permission_name>

Práticas recomendadas

O novo modelo de permissões fornece aos usuários uma experiência mais suave e facilita a instalação de aplicativos, deixando-os mais confortáveis com o que os aplicativos estão fazendo. Sugerimos que você siga as práticas recomendadas para aproveitar todas as vantagens do novo modelo.

Peça somente as permissões necessárias

Sempre que você pede uma permissão, o usuário é forçado a tomar uma decisão. Se o usuário negar a solicitação, a funcionalidade do aplicativo será reduzida. Deve-se minimizar o número de solicitações realizadas.

Por exemplo: o aplicativo pode frequentemente adquirir a funcionalidade necessária usando uma intenção em vez de solicitar permissões. Se o aplicativo precisa tirar fotos com a câmera do telefone, é possível usar uma intenção {@link android.provider.MediaStore#ACTION_IMAGE_CAPTURE MediaStore.ACTION_IMAGE_CAPTURE}. Quando o aplicativo executa a intenção, o sistema pede para que o usuário escolha um aplicativo de câmera já instalado para tirar a foto.

Não oprima o usuário

Se você confrontar o usuário com várias solicitações de permissão de uma só vez, é possível que ele se sinta oprimido e saia do aplicativo. Em vez disso, deve-se solicitar as permissões somente quando necessário.

Em alguns casos, uma ou mais permissões podem ser absolutamente essenciais para o aplicativo. Nesta situação, faz sentido solicitar todas as permissões assim que o aplicativo é iniciado. Por exemplo: se você fizer um aplicativo de fotografia, ele precisará de acesso à câmera do dispositivo. Quando o usuário iniciar o aplicativo pela primeira vez, ele não se surpreenderá quando receber uma solicitação de permissão para usar a câmera. Mas, se o mesmo aplicativo tiver um recurso para compartilhar fotos com os contatos do usuário, não se deve pedir esta permissão na primeira inicialização. Em vez disso, espere o usuário tentar usar o recurso de compartilhamento para pedir a permissão.

Se o aplicativo fornecer um tutorial, faz sentido solicitar as permissões necessárias no final da sequência do tutorial.

Explique o porquê da necessidade das permissões

O diálogo de permissões exibido pelo sistema ao chamar requestPermissions() diz quais permissões o aplicativo requer, mas não diz o porquê. Em alguns casos, o usuário pode achar isto confuso. É uma boa ideia explicar ao usuário o porquê da necessidade das permissões para o aplicativo antes de chamar requestPermissions().

Por exemplo: um aplicativo de fotografia pode precisar usar serviços de localização para poder marcar as fotos geograficamente. Um usuário normal pode não entender que uma foto pode conter informações de localização e ficar confuso quando o aplicativo de fotografia quiser saber a localização. Portanto, neste caso, é uma boa ideia o aplicativo explicar ao usuário sobre este recurso antes de chamar requestPermissions().

Uma maneira de fazer isto é incorporar estas solicitações em um tutorial do aplicativo. O tutorial pode exibir cada um dos recursos do aplicativo e, à medida que fizer isto, pode também explicar quais permissões são necessárias. Por exemplo, o tutorial do aplicativo de fotografia pode demonstrar os recursos de compartilhamento de fotos com os contatos e, em seguida, dizer ao usuário que ele precisa fornecer as permissões para que o aplicativo possa visualizar os contatos. O aplicativo pode então chamar requestPermissions() para solicitar ao usuário este acesso. É claro que nem todos os usuários seguirão o tutorial. Portanto, ainda é necessário verificar e solicitar as permissões durante a operação normal do aplicativo.