我们都知道 Android Marshmallow 引入了运行时权限,允许用户在运行时允许或拒绝任何权限。实现运行时权限是一个冗长乏味的过程,开发人员需要编写大量代码才能获得单个权限。
在本文中,我们将简化使用 Dexter 库添加运行时权限的过程。使用这个库,权限可以在几分钟内实现。下载示例 APK
这是一篇关于 Dexter 的介绍性文章,介绍了该框架所提供的基本特性。Dexter 还提供了其他一些功能,比如与 SnackBar 一起使用、不同类型的监听器、错误处理等等。你可以在 Dexter 的 GitHub主页 页面找到更多信息。
Dexter 库引入和使用
要开始使用 Dexter,请在 build.gradle 中添加依赖项:
1234dependencies {
// Dexter runtime permissions implementation 'com.karumi:dexter:4.2.0'
}
申请单个权限
要请求单个权限,可以通过传递所需的权限来使用 withPermission() 方法。您还需要一个 PermissionListener 回调来接收权限的状态。onPermissionGranted():将在授予权限后调用。
onPermissionDenied():将在权限被拒绝时调用。在这里,可以使用 response.isPermanentlyDenied() 条件检查权限是否被永久拒绝。
下面的代码请求摄像机(CAMERA)权限。
123456789101112131415161718192021Dexter.withActivity(this)
.withPermission(Manifest.permission.CAMERA)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
// permission is granted, open the camera }
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
// check for permanent denial of permission if (response.isPermanentlyDenied()) {
// navigate user to app settings }
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
申请多个权限
要同时请求多个权限,可以使用 withPermissions() 方法。下面的代码请求存储(STORAGE)和位置(LOCATION)权限。
1234567891011121314151617181920212223242526Dexter.withActivity(this)
.withPermissions(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
// check if all permissions are granted if (report.areAllPermissionsGranted()) {
// do you work now }
// check for permanent denial of any permission if (report.isAnyPermissionPermanentlyDenied()) {