Dexter 点击打开链接
是一个Android库,简化了请求权限的运行过程。
Android的棉花糖包括新功能让用户授予或拒绝权限,当运行一个应用程序而不是给予他们所有安装它时。这种方法给用户更多的控制权,但要求开发者添加大量的代码来支持它
Include the library in your build.gradle
dependencies{
compile 'com.karumi:dexter:2.1.4'
}
Usage
To start using the library you just need to initialize Dexter with a Context
, preferably your Application
as it won't be destroyed during your app lifetime:
public MyApplication extends Application {
@Override public void onCreate() {
super.onCreate();
Dexter.initialize(context);
}
}
Once the library is initialized you can start checking permissions at will. You have two options, you can either check for a single permission or check for multiple permissions at once.
Single permission
For each permission, register a PermissionListener
implementation to receive the state of the request:
Dexter.checkPermission(new PermissionListener() {
@Override public void onPermissionGranted(PermissionGrantedResponse response) {/* ... */}
@Override public void onPermissionDenied(PermissionDeniedResponse response) {/* ... */}
@Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {/* ... */}
}, Manifest.permission.CAMERA);
To make your life easier we offer some PermissionListener
implementations to perform recurrent actions:
EmptyPermissionListener
to make it easier to implement only the methods you want.DialogOnDeniedPermissionListener
to show a configurable dialog whenever the user rejects a permission request:PermissionListener dialogPermissionListener =
DialogOnDeniedPermissionListener.Builder
.withContext(context)
.withTitle("Camera permission")
.withMessage("Camera permission is needed to take pictures of your cat")
.withButtonText(android.R.string.ok)
.withIcon(R.mipmap.my_icon)
.build();
Dexter.checkPermission(dialogPermissionListener, Manifest.permission.CAMERA);
SnackbarOnDeniedPermissionListener
to show a snackbar message whenever the user rejects a permission request:PermissionListener snackbarPermissionListener =
SnackbarOnDeniedPermissionListener.Builder
.with(rootView, "Camera access is needed to take pictures of your dog")
.withOpenSettingsButton("Settings")
.build();
Dexter.checkPermission(snackbarPermissionListener, Manifest.permission.CAMERA);
CompositePermissionListener
to compound multiple listeners into one:PermissionListener snackbarPermissionListener = /*...*/;
PermissionListener dialogPermissionListener = /*...*/;
Dexter.checkPermission(new CompositePermissionListener(snackbarPermissionListener, dialogPermissionListener, /*...*/), Manifest.permission.CAMERA);
If you want to request multiple permissions you just need to do the same but registering an implementation ofMultiplePermissionsListener
:
Collection<String> permissions = Arrays.asList(
Dexter.checkPermissions(new MultiplePermissionsListener() {
@Override public void onPermissionsChecked(MultiplePermissionsReport report) {/* ... */}
@Override public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {/* ... */}
}, Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.RECORD_AUDIO);
The MultiplePermissionsReport
contains all the details of the permission request like the list of denied/granted permissions or utility methods like areAllPermissionsGranted
and isAnyPermissionPermanentlyDenied
.
As with the single permission listener, there are also some useful implementations for recurring patterns:
EmptyMultiplePermissionsListener
to make it easier to implement only the methods you want.DialogOnAnyDeniedMultiplePermissionsListener
to show a configurable dialog whenever the user rejects at least one permission:MultiplePermissionsListener dialogMultiplePermissionsListener =
DialogOnAnyDeniedMultiplePermissionsListener.Builder
.withContext(context)
.withTitle("Camera & audio permission")
.withMessage("Both camera and audio permission are needed to take pictures of your cat")
.withButtonText(android.R.string.ok)
.withIcon(R.mipmap.my_icon)
.build();
Dexter.checkPermissions(dialogMultiplePermissionsListener, Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.RECORD_AUDIO);
SnackbarOnAnyDeniedMultiplePermissionsListener
to show a snackbar message whenever the user rejects any of the requested permissions:MultiplePermissionsListener snackbarMultiplePermissionsListener =
SnackbarOnAnyDeniedMultiplePermissionsListener.Builder
.with(rootView, "Camera and audio access is needed to take pictures of your dog")
.withOpenSettingsButton("Settings")
.build();
Dexter.checkPermissions(snackbarMultiplePermissionsListener, Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS, Manifest.permission.RECORD_AUDIO);
CompositePermissionListener
to compound multiple listeners into one:MultiplePermissionsListener snackbarMultiplePermissionsListener = /*...*/;
MultiplePermissionsListener dialogMultiplePermissionsListener = /*...*/;
Dexter.checkPermissions(new CompositePermissionListener(snackbarMultiplePermissionsListener, dialogMultiplePermissionsListener, /*...*/), Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO);
Android will notify you when you are requesting a permission that needs an additional explanation for its usage, either because it is considered dangerous, or because the user has already declined that permission once.
Dexter will call the method onPermissionRationaleShouldBeShown
implemented in your listener with a PermissionToken
. It's important to keep in mind that the request process will pause until the token is used, therefore, you won't be able to call Dexter again or request any other permissions if the token has not been used.
The most simple implementation of your onPermissionRationaleShouldBeShown
method could be:
@Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
token.continuePermissionRequest();
}
If your application has to support configuration changes based on screen rotation remember to add a call to Dexter
in your Activity onCreate
method as follows:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample_activity);
Dexter.continuePendingRequestsIfPossible(permissionsListener);
}