RxPermissions——权限申请库

RxPermissions——权限申请库

Android运行时权限中,介绍了关于Android的系统权限分类,以及在Android6.0之后申请运行时权限的官方使用的方法。
而RxPermissions就是一个处理权限申请的库,其除了是为了适应Android6.0新的权限模式的开源框架之外,一般是与RxJava配合一起使用。
一、RxPermissions的好处

  1. 开发者不用担心Android运行环境的版本,RxPermissions内部已经对Android的版本进行了判定
  2. 将权限申请代码和请求结果的代码放在一起管理,避免了代码分散
  3. RxPermissions具备Rx的特性,例如可以使用链式操作,可以执行filter操作以及transform操作等等。

二、RxPermissions使用注意事项
在这里插入图片描述
RxPermissions是基于RxJava的,因此RxPermissions也就有两个版本,分别支持RxJava和RxJava2。
RxPermissions使用的minSdkVersion必须>=11
使用RxPermissions申请权限,必须在Activity.onCreate()或者view.onFinishInflate()中处理。不能在onResume()中处理,因为onResume()在App生命周期中可能执行的很频繁。如果在请求权限的时候,App重新启动了(例如屏幕旋转导致了App关闭在重新创建),那么用户的选择将无法传递给App。

三、RxPermissions的使用
在使用RxPermissions的时,需要申请的权限要在AndroidManifest中先声明。

  1. 直接申请权限使用
    new RxPermissions (this)是以单例的形式使用,可以用于直接申请权限,如下代码所示。
    在这里插入图片描述
    与原Android提供的处理不同的是,RxPermissions这里直接返回授权的结果,链式调用,更为清晰。
  2. 条件触发获取权限(结合RxBing使用)
    通过结合RxBing(关于RxBing可以查看:RxBing的Github官方文档)可以达到某个条件触发的时候获取权限,例子如所示。
    在这里插入图片描述
    在这里插入图片描述
  3. 同时请求多个权限(合并结果)
    当需要请求多个权限时,例如申请牌照和录音权限,可以使用request()或者ensure()方法如下。
    在这里插入图片描述
    由上述代码可以看出,当使用request()方法同时请求多个权限时,结果会合并,即accept()函数只会被调用一次,接收的参数为Boolean,当所有权限都被给予的时候该Boolean为true,否则为false
  4. 同时请求多个权限(分别获取结果)
    如果想要在同时请求多个权限,并且分别获取权限申请结果,可以调用requestEach()方法或者ensureEach()方法。
    在这里插入图片描述
    经过测试,使用requestEach()方法请求多个权限时,accept()方法会被调用多次,即申请了几个权限accept()方法就被调用了几次,每一次的调用都是对每一个权限的是否被授予权限的单独结果,因此该方法是对每个权限的单独处理

四、requestXX()方法和ensureXX()方法
在这里插入图片描述
在前面的例子中,提到了两种申请权限的方法:requestXX()和ensureXX(),那么两种的关系是如何的?
两者的区别:requestXX()方法的返回值是Observable对象,而ensureXX()方法返回的是ObservableTransformer的对象,返回值的区别表明了其使用方式不一样,requestXX()方法可以直接通过RxPermissions使用,而ensureXX()方法主要是结合RxBing作为compose()方法的参数进行使用。

  1. requestXX()方法
    request():结果回调的参数为Boolean类型,该类型函数请求权限的名称、请求权限结果等信息,请求多个权限时,请求的全部权限都成功时为true,否则为false
    requestEach():请求多个权限时,结果回调会被多次调用,可以获取到每个权限的请求结果。
    requestEachCombined():结果会被回调一次,请求多个权限,结果回调参数为Permission类型,请求的全部权限都成功时,Permission.granted为true,至少有一个被拒绝的、并且没有选择不再提醒的权限时,Permission.shouldShowRequestPermissionRationale结果为true。
  2. ensureXX()方法
    ensure():类似request()方法,结果回调的参数为Boolean类型,权限请求成功为true,否则为false;当请求多个权限时,请求的全部权限都成功为true,否则为false。
    ensureEach():类似requestEach(),请求多个权限时,结果回调会被多次调用,可以获取到每个权限的请求结果。
    ensureEachCombined():结果会回调一次,回调参数为Permission类型,与requestEach()的不太一样,该类型参数对象中包含了所有请求权限的名字,并且所有权限都成功的话,Permission的granted属性为true,否则为false
    在这里插入图片描述

参考资料:使用RxPermissions(基于RxJava2)
Android权限管理之RxPermissions解决Android6.0适配问题
RxPermissions源码解析
Github官网:RxPermissions的Github官方文档

猜你喜欢

转载自blog.csdn.net/weixin_38196407/article/details/87696250