RxPermissions——权限申请库

在Android基础知识(十六):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官方文档

RxPermissions——权限申请库相关推荐

  1. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 最简单用法 | 一行代码搞定权限申请 | 推荐用法 )

    文章目录 一.添加依赖 二.在 AndroidManifest.xml 中配置权限 三.权限申请最简单用法 四.推荐使用的用法 五.GitHub 地址 上一篇博客 [Android 应用开发]Goog ...

  2. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 简介 | 权限申请处理细节 | 添加依赖 | 界面权限申请结果处理 | 权限申请结果回调接口 )

    文章目录 一.EasyPermissions 简介 二.EasyPermissions 权限申请处理细节 三.添加 EasyPermissions 依赖 四.权限申请结果处理 方法 onRequest ...

  3. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )

    文章目录 一.申请权限 二.申请权限原理对话框 三.引导用户手动设置权限对话框 四.在 AndroidManifest.xml 中配置权限 五.完整代码示例 六.GitHub 地址 一.申请权限 申请 ...

  4. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 权限申请原理对话框操作回调接口 | 永久拒绝权限后引导设用户置权限 )

    文章目录 一.权限申请原理对话框操作回调接口 RationaleCallbacks 二.永久拒绝权限后引导设用户置权限 一.权限申请原理对话框操作回调接口 RationaleCallbacks 权限申 ...

  5. Android权限申请库——EasyPermissions使用详解和打开相册方法

    1.添加依赖 dependencies {implementation 'pub.devrel:easypermissions:3.0.0' } 2.在AndroidManifest文件中添加需要的权 ...

  6. Android 6.0动态权限申请

    Android 6.0动态权限申请 特别感谢: https://www.jianshu.com/p/2fe4fb3e8ce0 本文是在该文的基础上添加了类似自己的读后感才完成的. 我并不希望成为白求恩 ...

  7. 最容易理解的Android6.0动态权限申请教程

    1.前言 这已经是N年前的知识点了,但是我一直以来都有点逃避学习这个,而且印象中很麻烦,后来也不间断有学习过一点,但是一直没认真去用过,所以对这个android6.0的动态权限申请一直是不清楚的状态, ...

  8. 【Android 热修复】热修复原理 ( Dex 文件拷贝后续操作 | 外部存储空间权限申请 | 执行效果验证 | 源码资源 )

    文章目录 一.Dex 文件准备 二.外部存储空间权限申请 1.清单文件申请权限 2.动态申请权限 三.文件拷贝 1.文件拷贝 2.执行效果 四. 源码资源 一.Dex 文件准备 在 [Android ...

  9. android权限申请Permission

    代码地址如下: http://www.demodashi.com/demo/12432.html android在6.0系统以后,权限申请变得麻烦起来,今天介绍一个超级好用的权限申请库,我在使用中经过 ...

最新文章

  1. 关于HTML代码的转义
  2. 【Mood 19】DailyBuild 2月
  3. TCP/IP学习笔记(九)TCP报文段首部格式
  4. (转)更新Java final常量后,请重新编译你的class
  5. 《论文笔记》Robust Cooperative UAV Visual SLAM
  6. Go -- php 中的pack(H*, $string) 转换成go
  7. react-native ListView 封装 实现 下拉刷新/上拉加载更多
  8. console_init_r()函数分析
  9. 一个超级简单的csv读取工具类
  10. PHP获取汉字的拼音(支持首字母和全拼)
  11. 大数据求中位数(插值计算)
  12. shfileoperation C#无法读源文件或磁盘XP系统1026错误
  13. R中五种常用的统计分析方法
  14. 怎样快速找出百度云盘文件夹里分享失败文件
  15. 如果你会了sass,你就会了ECMAScript6
  16. 原谅我,无法刻骨铭心地记住你
  17. el-table单元格不自动换行
  18. java als算法实现_ALS算法实现用户音乐打分预测
  19. freemarker html 换行,java使用freemarker模板导出word,合并单元格,单元格内换行
  20. 40亿美元,Uber自动驾驶“大甩卖”!明星初创企业Aurora接手,首款产品不做出租车...

热门文章

  1. 银联商务-商户统计服务平台
  2. EgretH5游戏开发笔记(一)
  3. 计算机网络---网络架构与协议
  4. pandas 多条件筛选DataFrame
  5. java计算机毕业设计高校宿舍管理系统源码+mysql数据库+系统+lw文档+部署
  6. (26)二路插入排序
  7. wallhaven的热度壁纸爬取(入门级爬虫)——python
  8. kali渗透测试系列---信息收集
  9. office2010 SP1补丁,先打visio2010sp1,再打officesuite2010sp1则打不上。
  10. 一个屌丝程序猿的人生(二十五)