EasyPermissions es una biblioteca contenedora para simplificar la lógica básica de permisos del sistema cuando se utiliza Android M o superior.
Nota: Si su aplicación está escrita en Kotlin, considere la biblioteca easypermissions-ktx que agrega extensiones de Kotlin a la biblioteca principal de EasyPermissions.
EasyPermissions se instala agregando la siguiente dependencia a su archivo 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 comenzar a usar EasyPermissions, haga que su Activity
(o Fragment
) anule el 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 );
}
}
El siguiente ejemplo muestra cómo solicitar permisos para un método que requiere permisos CAMERA
y ACCESS_FINE_LOCATION
. Hay algunas cosas a tener en cuenta:
EasyPermissions#hasPermissions(...)
para comprobar si la aplicación ya tiene los permisos necesarios. Este método puede tomar cualquier número de permisos como argumento final.EasyPermissions#requestPermissions
. Este método solicitará los permisos del sistema y mostrará la cadena de justificación proporcionada si es necesario. El código de solicitud proporcionado debe ser exclusivo para esta solicitud y el método puede tomar cualquier número de permisos como argumento final.AfterPermissionGranted
. Esto es opcional, pero se proporciona por conveniencia. Si se otorgan todos los permisos en una solicitud determinada, se ejecutarán todos los métodos anotados con el código de solicitud adecuado (asegúrese de tener un código de solicitud único). El método anotado debe ser nulo y sin parámetros de entrada (en su lugar, puede usar onSaveInstanceState para mantener el estado de los parámetros suprimidos). Esto es para simplificar el flujo común de necesidad de ejecutar el método de solicitud después de que se hayan otorgado todos sus permisos. Esto también se puede lograr agregando lógica en la devolución de llamada 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 );
}
}
O para un control más preciso sobre el cuadro de diálogo de fundamento, utilice 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 un control más preciso, puede hacer que su Activity
/ Fragment
implemente la interfaz 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
// ...
}
}
En algunos casos, tu aplicación no funcionará correctamente sin ciertos permisos. Si el usuario niega estos permisos con la opción "Nunca volver a preguntar", no podrá solicitar estos permisos al usuario y deberá cambiarlos en la configuración de la aplicación. Puede utilizar el método EasyPermissions.somePermissionPermanentlyDenied(...)
para mostrar un cuadro de diálogo al usuario en esta situación y dirigirlo a la pantalla de configuración del sistema para su aplicación:
Nota : debido a una limitación en la información proporcionada por la API de permisos del marco de Android, el método somePermissionPermanentlyDenied
solo funciona después de que se haya denegado el permiso y su aplicación haya recibido la devolución de llamada onPermissionsDenied
. De lo contrario, la biblioteca no puede distinguir el caso de denegación permanente del caso "aún no denegado".
@ 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
si desea interactuar con el cuadro de diálogo de justificación.
@ Override
public void onRationaleAccepted ( int requestCode ) {
// Rationale accepted to request some permissions
// ...
}
@ Override
public void onRationaleDenied ( int requestCode ) {
// Rationale denied to request some permissions
// ...
}
Las devoluciones de llamadas justificativas no implican necesariamente cambios de permisos. Para verificarlos, 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.