Skip to content

Most visited

Recently visited

navigation

Solicitação de permissões em tempo de execução

Esta lição ensina a

Dependências e pré-requisitos

  • Android 6.0 (nível de API 23)

Leia também

A partir do Android 6.0 (nível de API 23), os usuários concedem permissões a aplicativos enquanto eles estão em execução, não quando eles são instalados. Essa abordagem otimiza o processo de instalação de aplicativos, pois o usuário não precisa conceder permissões ao instalar ou atualizar o aplicativo. Ela também confere ao usuário mais controle sobre os recursos do aplicativo. Por exemplo, um usuário poderia optar por permitir que um aplicativo de câmera tenha acesso à câmera, mas não à localização do dispositivo. O usuário pode revogar as permissões a qualquer momento na tela Settings do aplicativo.

As permissões do sistema são dividas em duas categorias: normais e perigosas:

Para saber mais, consulte Permissões normais e perigosas.

Em todas as versões do Android, seu aplicativo precisa declarar as permissões normais e perigosas de que precisa em seu manifesto, conforme é descrito em Declaração de permissões. No entanto, o efeito dessa declaração é diferente dependendo da versão do sistema e do nível do SDK de destino do seu aplicativo:

Observação: A partir do Android 6.0 (nível de API 23), os usuários podem revogar permissões de qualquer aplicativo a qualquer momento, mesmo que o aplicativo utilize um nível de API inferior. Teste seu aplicativo para verificar se ele se comportar corretamente quando não tiver uma permissão necessária, independentemente do nível de API de destino.

Esta lição descreve como usar a Biblioteca de suporte do Android para verificar e solicitar permissões. A estrutura do Android oferece métodos semelhantes a partir do Android 6.0 (nível de API 23). No entanto, usar a biblioteca de suporte é mais fácil, pois seu aplicativo não precisa verificar qual versão do Android está sendo executada antes de chamar os métodos.

Verificar permissões

Se seu aplicativo precisar de uma permissão perigosa, você deverá verificar se tem essa permissão sempre que realizar uma ação que precise dela. O usuário pode revogar a permissão a qualquer momento, portanto, mesmo que o aplicativo tenha usado a câmera ontem, ele não pode presumir que ainda tem essa permissão hoje.

Para verificar se você tem uma permissão, chame o método ContextCompat.checkSelfPermission(). Por exemplo, este snippet mostra como verificar se a atividade tem permissão para escrever no calendário:

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);

Se o aplicativo tiver a permissão, o método retornará PackageManager.PERMISSION_GRANTED e o aplicativo poderá continuar com a operação. Se o aplicativo não tiver a permissão, o método retornará PERMISSION_DENIED e o aplicativo precisará solicitar a permissão do usuário explicitamente.

Solicitar permissões

Se seu aplicativo precisar de uma permissão perigosa que foi listada no manifesto, ele deverá solicitar que o usuário a conceda. O Android oferece diversos métodos que podem ser usados para solicitar uma permissão. Chamar esses métodos exibe uma caixa de diálogo padrão do Android que não pode ser personalizada.

Explique por que o aplicativo precisa das permissões

Figura 1. Caixa de diálogo do sistema solicitando que o usuário conceda ou negue uma permissão.

Em algumas circunstâncias, pode ser necessário ajudar o usuário a entender por que seu aplicativo precisa de uma permissão. Por exemplo, se um usuário iniciar um aplicativo de fotografia, ele provavelmente não se surpreenderia se o aplicativo solicitasse permissão para usar a câmera, mas talvez não entenda por que o aplicativo deseja acessar a localização ou os contatos do usuário. Antes de solicitar uma permissão, considere fornecer uma explicação para o usuário. Lembre-se de não sobrecarregar o usuário com explicações; se você fornecer explicações demais, o usuário poderá achar o aplicativo frustrante e removê-lo.

Uma possível abordagem é fornecer uma explicação apenas se o usuário já tiver negado uma solicitação de permissão. Se um usuário continua tentando usar um recurso que precisa de uma permissão, mas recusa essa solicitação de permissão, isso provavelmente indica que o usuário não entende por que o aplicativo precisa dessa permissão para utilizar o recurso em questão. Em uma situação como essa, é recomendável fornecer uma explicação.

Para ajudar a descobrir situações nas quais um usuário possa precisar de uma explicação, o Android oferece um método utilitário, shouldShowRequestPermissionRationale(). Esse método retorna true se o usuário já tiver negado uma solicitação de permissão realizada pelo aplicativo.

Observação: Se o usuário negou a solicitação de permissão e escolheu a opção Don't ask again na caixa de diálogo de solicitação de permissão do sistema, esse método retornará false. O método também retornará false se as políticas do dispositivo proibirem o aplicativo de ter essa permissão.

Solicite as permissões de que precisa

Se seu aplicativo ainda não tiver a permissão de que precisa, ele deve chamar um dos métodos requestPermissions() para solicitar as permissões apropriadas. Seu aplicativo passa as permissões desejadas e um código de solicitação na forma de um número inteiro que você especifica para identificar a solicitação de permissão. Esse 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 callback do aplicativo com os resultados, passando o mesmo código de solicitação que o aplicativo passou para requestPermissions().

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

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

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

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Observação: Quando seu aplicativo chama requestPermissions(), o sistema mostra uma caixa de diálogo padrão ao usuário. Seu aplicativo não pode configurar ou alterar essa caixa de diálogo. Se precisar fornecer informações ou explicações ao usuário, faça isso antes de chamar requestPermissions(), conforme é descrito na seção Explique por que o aplicativo precisa das permissões.

Lide com a resposta de solicitação de permissões

Quando seu aplicativo solicita permissões, o sistema apresenta uma caixa de diálogo ao usuário. Quando o usuário responde, o sistema invoca o método onRequestPermissionsResult() do aplicativo, passando a ele a resposta do usuário. Seu aplicativo precisa modificar esse método para descobrir se a permissão foi concedida. O callback 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 callback:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

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

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

A caixa de diálogo mostrada pelo sistema descreve o grupo de permissões que seu aplicativo precisa acessar; ela não lista a permissão específica. Por exemplo, se você solicitar a permissão READ_CONTACTS, a caixa de diálogo do sistema simplesmente dirá que seu aplicativo precisa acessar os contatos do dispositivo. O usuário só precisa conceder essa permissão uma vez para cada grupo de permissões. Se seu aplicativo solicitar qualquer outra permissão do grupo em questão (que esteja listada no manifesto do aplicativo), o sistema a concederá automaticamente. Quando você solicita a permissão, o sistema chama seu método de callback onRequestPermissionsResult() e passa PERMISSION_GRANTED, da mesma forma que faria se o usuário tivesse concedido sua solicitação explicitamente pela caixa de diálogo do sistema.

Observação: Seu aplicativo ainda deve solicitar explicitamente todas as permissões de que precisar, mesmo que o usuário já tenha concedido outra permissão do mesmo grupo. Além disso, a organização de permissões em grupo poderá mudar em versões futuras do Android. Seu código não deve depender da ideia de que permissões específicas estejam ou não no mesmo grupo.

Por exemplo, suponha que você liste READ_CONTACTS e WRITE_CONTACTS no manifesto do seu aplicativo. Se você solicitar READ_CONTACTS e o usuário conceder a permissão, e você, depois disso, solicitar WRITE_CONTACTS, o sistema concederá essa permissão imediatamente sem interagir com o usuário.

Se o usuário negar uma solicitação de permissão, seu aplicativo deve executar a ação apropriada. Por exemplo, seu aplicativo pode mostrar uma caixa de diálogo explicando por que não conseguiu executar a ação solicitada pelo usuário que precisa da permissão em questã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, sempre que um aplicativo usa requestPermissions() para solicitar essa permissão, o sistema nega imediatamente. O sistema chama seu método de retorno de chamada onRequestPermissionsResult() e passa PERMISSION_DENIED da mesma forma que faria se o usuário tivesse rejeitado explicitamente a solicitação novamente. Isso significa que, ao chamar requestPermissions(), você não pode presumir que tenha ocorrido qualquer interação direta com o usuário.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)