EasyPermissions é uma biblioteca wrapper para simplificar a lógica básica de permissões do sistema ao direcionar o Android M ou superior.
Observação: se seu aplicativo for escrito em Kotlin, considere a biblioteca easypermissions-ktx, que adiciona extensões Kotlin à biblioteca principal EasyPermissions.
EasyPermissions é instalado adicionando a seguinte dependência ao seu arquivo build.gradle
:
dependencies {
// For developers using AndroidX in their applications
implementation ' pub.devrel:easypermissions:3.0.0 '
// For developers using the Android Support Library
implementation ' pub.devrel:easypermissions:2.0.1 '
}
Para começar a usar EasyPermissions, faça com que sua Activity
(ou Fragment
) substitua o método onRequestPermissionsResult
:
public class MainActivity extends AppCompatActivity {
@ Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_main );
}
@ Override
public void onRequestPermissionsResult ( int requestCode , String [] permissions , int [] grantResults ) {
super . onRequestPermissionsResult ( requestCode , permissions , grantResults );
// Forward results to EasyPermissions
EasyPermissions . onRequestPermissionsResult ( requestCode , permissions , grantResults , this );
}
}
O exemplo abaixo mostra como solicitar permissões para um método que requer permissões CAMERA
e ACCESS_FINE_LOCATION
. Existem algumas coisas a serem observadas:
EasyPermissions#hasPermissions(...)
para verificar se o aplicativo já possui as permissões necessárias. Este método pode receber qualquer número de permissões como argumento final.EasyPermissions#requestPermissions
. Este método solicitará as permissões do sistema e mostrará a sequência de justificativa fornecida, se necessário. O código de solicitação fornecido deve ser exclusivo para esta solicitação e o método pode receber qualquer número de permissões como argumento final.AfterPermissionGranted
. Isso é opcional, mas fornecido por conveniência. Se todas as permissões em uma determinada solicitação forem concedidas, todos os métodos anotados com o código de solicitação adequado serão executados (certifique-se de ter um código de solicitação exclusivo). O método anotado precisa ser nulo e sem parâmetros de entrada (em vez disso, você pode usar onSaveInstanceState para manter o estado dos seus parâmetros suprimidos). Isso simplifica o fluxo comum de necessidade de executar o método solicitante após todas as suas permissões terem sido concedidas. Isso também pode ser conseguido adicionando lógica no retorno de chamada onPermissionsGranted
. @ AfterPermissionGranted ( RC_CAMERA_AND_LOCATION )
private void methodRequiresTwoPermission () {
String [] perms = { Manifest . permission . CAMERA , Manifest . permission . ACCESS_FINE_LOCATION };
if ( EasyPermissions . hasPermissions ( this , perms )) {
// Already have permission, do the thing
// ...
} else {
// Do not have permissions, request them now
EasyPermissions . requestPermissions ( this , getString ( R . string . camera_and_location_rationale ),
RC_CAMERA_AND_LOCATION , perms );
}
}
Ou para um controle mais preciso sobre a caixa de diálogo de justificativa, use um PermissionRequest
:
EasyPermissions . requestPermissions (
new PermissionRequest . Builder ( this , RC_CAMERA_AND_LOCATION , perms )
. setRationale ( R . string . camera_and_location_rationale )
. setPositiveButtonText ( R . string . rationale_ask_ok )
. setNegativeButtonText ( R . string . rationale_ask_cancel )
. setTheme ( R . style . my_fancy_style )
. build ());
Opcionalmente, para um controle mais preciso, você pode fazer com que sua Activity
/ Fragment
implemente a interface PermissionCallbacks
.
public class MainActivity extends AppCompatActivity implements EasyPermissions . PermissionCallbacks {
@ Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_main );
}
@ Override
public void onRequestPermissionsResult ( int requestCode , String [] permissions , int [] grantResults ) {
super . onRequestPermissionsResult ( requestCode , permissions , grantResults );
// Forward results to EasyPermissions
EasyPermissions . onRequestPermissionsResult ( requestCode , permissions , grantResults , this );
}
@ Override
public void onPermissionsGranted ( int requestCode , List < String > list ) {
// Some permissions have been granted
// ...
}
@ Override
public void onPermissionsDenied ( int requestCode , List < String > list ) {
// Some permissions have been denied
// ...
}
}
Em alguns casos, seu aplicativo não funcionará corretamente sem determinadas permissões. Se o usuário negar essas permissões com a opção “Nunca perguntar novamente”, você não poderá solicitar essas permissões ao usuário e elas deverão ser alteradas nas configurações do aplicativo. Você pode usar o método EasyPermissions.somePermissionPermanentlyDenied(...)
para exibir uma caixa de diálogo ao usuário nesta situação e direcioná-lo para a tela de configuração do sistema do seu aplicativo:
Observação : devido a uma limitação nas informações fornecidas pela API de permissões da estrutura do Android, o método somePermissionPermanentlyDenied
só funciona depois que a permissão foi negada e seu aplicativo recebeu o retorno de chamada onPermissionsDenied
. Caso contrário, a biblioteca não poderá distinguir a negação permanente do caso “ainda não negado”.
@ Override
public void onPermissionsDenied ( int requestCode , List < String > perms ) {
Log . d ( TAG , "onPermissionsDenied:" + requestCode + ":" + perms . size ());
// (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
// This will display a dialog directing them to enable the permission in app settings.
if ( EasyPermissions . somePermissionPermanentlyDenied ( this , perms )) {
new AppSettingsDialog . Builder ( this ). build (). show ();
}
}
@ Override
public void onActivityResult ( int requestCode , int resultCode , Intent data ) {
super . onActivityResult ( requestCode , resultCode , data );
if ( requestCode == AppSettingsDialog . DEFAULT_SETTINGS_REQ_CODE ) {
// Do something after user returned from app settings screen, like showing a Toast.
Toast . makeText ( this , R . string . returned_from_app_settings_to_activity , Toast . LENGTH_SHORT )
. show ();
}
}
Implemente EasyPermissions.RationaleCallbacks
se desejar interagir com a caixa de diálogo de lógica.
@ Override
public void onRationaleAccepted ( int requestCode ) {
// Rationale accepted to request some permissions
// ...
}
@ Override
public void onRationaleDenied ( int requestCode ) {
// Rationale denied to request some permissions
// ...
}
Os retornos de chamada justificativos não implicam necessariamente alterações de permissão. Para verificar isso, consulte EasyPermissions.PermissionCallbacks
.
Copyright 2017 Google
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.