RxPermissions介绍与使用

发布时间:2023-05-18

一、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能够让你的代码更加简洁,清晰明了。