EasyPermissions est une bibliothèque wrapper pour simplifier la logique des autorisations système de base lorsque vous ciblez Android M ou supérieur.
Remarque : si votre application est écrite en Kotlin, pensez à la bibliothèque easypermissions-ktx qui ajoute des extensions Kotlin à la bibliothèque principale EasyPermissions.
EasyPermissions est installé en ajoutant la dépendance suivante à votre fichier 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 '
}
Pour commencer à utiliser EasyPermissions, demandez à votre Activity
(ou Fragment
) de remplacer la méthode 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 );
}
}
L'exemple ci-dessous montre comment demander des autorisations pour une méthode qui nécessite à la fois les autorisations CAMERA
et ACCESS_FINE_LOCATION
. Il y a quelques points à noter :
EasyPermissions#hasPermissions(...)
pour vérifier si l'application dispose déjà des autorisations requises. Cette méthode peut prendre n’importe quel nombre d’autorisations comme argument final.EasyPermissions#requestPermissions
. Cette méthode demandera les autorisations système et affichera la chaîne de justification fournie si nécessaire. Le code de requête fourni doit être unique à cette requête et la méthode peut prendre n'importe quel nombre d'autorisations comme argument final.AfterPermissionGranted
. Ceci est facultatif, mais fourni pour plus de commodité. Si toutes les autorisations d'une requête donnée sont accordées, toutes les méthodes annotées avec le code de requête approprié seront exécutées (assurez-vous d'avoir un code de requête unique). La méthode annotée doit être vide et sans paramètres d'entrée (à la place, vous pouvez utiliser onSaveInstanceState afin de conserver l'état de vos paramètres supprimés). Il s'agit de simplifier le flux courant consistant à devoir exécuter la méthode de requête une fois que toutes ses autorisations ont été accordées. Cela peut également être réalisé en ajoutant une logique au rappel 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 pour un contrôle plus précis de la boîte de dialogue de justification, utilisez un 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 ());
En option, pour un contrôle plus fin, vous pouvez demander à votre Activity
/ Fragment
d'implémenter l'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
// ...
}
}
Dans certains cas, votre application ne fonctionnera pas correctement sans certaines autorisations. Si l'utilisateur refuse ces autorisations avec l'option « Ne plus jamais demander », vous ne pourrez pas demander ces autorisations à l'utilisateur et elles doivent être modifiées dans les paramètres de l'application. Vous pouvez utiliser la méthode EasyPermissions.somePermissionPermanentlyDenied(...)
pour afficher une boîte de dialogue à l'utilisateur dans cette situation et le diriger vers l'écran de configuration système de votre application :
Remarque : En raison d'une limitation des informations fournies par l'API des autorisations du framework Android, la méthode somePermissionPermanentlyDenied
ne fonctionne qu'après que l'autorisation a été refusée et que votre application a reçu le rappel onPermissionsDenied
. Dans le cas contraire, la bibliothèque ne peut pas distinguer le cas d'un refus permanent du cas "pas encore refusé".
@ 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 ();
}
}
Implémentez EasyPermissions.RationaleCallbacks
si vous souhaitez interagir avec la boîte de dialogue de justification.
@ Override
public void onRationaleAccepted ( int requestCode ) {
// Rationale accepted to request some permissions
// ...
}
@ Override
public void onRationaleDenied ( int requestCode ) {
// Rationale denied to request some permissions
// ...
}
Les rappels de justification n’impliquent pas nécessairement des modifications d’autorisation. Pour les vérifier, consultez 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.