一、RxPermissions是什么
RxPermissions是基于RxJava的Android权限请求库。它的请求权限与原生的请求方式相比更为简单易用,而且在用户拒绝授权后给予了极佳的处理方式。使用RxPermissions我们可以避免接连弹出多个权限请求弹窗的问题。
1、添加RxPermissions
我们首先需要添加RxPermissions库的依赖。
<dependency>
<groupId>com.tbruyelle.rxpermissions2</groupId>
<artifactId>rxpermissions</artifactId>
<version>0.10.2</version>
</dependency>
2、声明RxPermissions
在Activity中声明一个RxPermissions对象:
RxPermissions rxPermissions = new RxPermissions(this);
二、RxPermissions的使用方法
1、请求单个权限
请求单个权限非常简单,我们只需要调用RxPermissions的request()
方法并传入需要请求的权限即可。
if (rxPermissions.isGranted(android.Manifest.permission.CAMERA)) {
// 已经授权
} else {
// 未授权,请求相机权限
rxPermissions.request(android.Manifest.permission.CAMERA)
.subscribe(granted -> {
if (granted) {
// 授权成功
} else {
// 授权失败
}
});
}
2、请求多个权限
请求多个权限时我们只需要在request()
方法中传入需要请求的多个权限即可。
rxPermissions.request(
android.Manifest.permission.CAMERA,
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(granted -> {
if (granted) {
// 授权成功
} else {
// 授权失败
}
});
3、请求带拒绝提示的权限
在用户拒绝授权时,我们可以使用RxPermissions的requestEachCombined()
方法来请求权限。这个方法会在用户拒绝多个权限时给予一个统一的拒绝提示。
rxPermissions.requestEachCombined(
android.Manifest.permission.CAMERA,
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(permission -> {
if (permission.granted) {
// 授权成功
} else if (permission.shouldShowRequestPermissionRationale) {
// 用户拒绝授权,但未勾选“不再询问”
} else {
// 用户拒绝授权,且勾选了“不再询问”
}
});
4、请求某个权限的状态
我们可以使用RxPermissions的isGranted()
方法来查询某个权限是否已经授权。代码如下:
if (rxPermissions.isGranted(android.Manifest.permission.CAMERA)) {
// 已经授权
} else {
// 未授权
}
5、请求多个权限的状态
我们可以使用RxPermissions的requestEach()
方法来查询并且请求多个权限的状态。这个方法将会返回多个权限的状态,我们可以根据状态判断权限是否已经被授权。
rxPermissions.requestEach(
android.Manifest.permission.CAMERA,
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(permission -> {
if (permission.granted) {
// 权限已经授权
} else if (permission.shouldShowRequestPermissionRationale) {
// 用户拒绝授权,但未勾选“不再询问”
} else {
// 用户拒绝授权,且勾选了“不再询问”
}
});
三、RxPermissions的错误处理
在使用RxPermissions时,我们需要关注请求权限时可能会出现的错误。下面我们将介绍常见的两种错误。
1、权限被拒绝,但未勾选“不再询问”
在请求某个权限时,用户拒绝授权,但没有勾选“不再询问”,此时可以通过shouldShowRequestPermissionRationale
属性来判断。shouldShowRequestPermissionRationale
属性值为true
时表示用户拒绝授权,但未勾选“不再询问”。
2、权限被拒绝,且勾选了“不再询问”
在请求某个权限时,用户拒绝授权,且勾选了“不再询问”,此时我们可以通过requestPermissions()
方法给出提示,引导用户前往设置页面开启权限。
if (permission.granted) {
// 权限已经授权
} else if (permission.shouldShowRequestPermissionRationale) {
// 用户拒绝授权,但未勾选“不再询问”
} else {
// 用户拒绝授权,且勾选了“不再询问”
Toast.makeText(MainActivity.this, "请前往应用设置中打开相应权限", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_SETTING); // REQUEST_SETTING是一个请求码
}
四、RxPermissions的优点
1、简单易用
RxPermissions请求权限提供的方法比系统提供的更加容易理解。
2、多权限请求
我们可以一次性请求多个权限。
3、错误处理
RxPermissions提供了更好的错误处理方式,通过判断shouldShowRequestPermissionRationale
属性值,我们可以充分避免在用户多次拒绝授权后,系统会自动隐藏权限请求弹窗的问题。
4、兼容性好
RxPermissions支持Android 6.0以上的系统版本,并支持AndroidX。
5、可观察状态
RxPermissions提供了可观察的请求状态,这意味着我们可以使用RxJava的操作符对权限请求做更多的处理。
五、总结
通过以上介绍,我们可以看到,使用RxPermissions可以有效地避免代码复杂度的增加,而且在用户拒绝授权的情况下,提供了较好的错误处理方式。RxPermissions的使用方式也非常方便,我们只需要调用request()
方法即可请求权限。使用RxPermissions能够让你的代码更加简洁,清晰明了。