前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初识 RxPermissions

初识 RxPermissions

作者头像
阿策小和尚
发布2019-08-12 15:38:35
1.3K0
发布2019-08-12 15:38:35
举报
文章被收录于专栏:阿策小和尚

和尚曾经在面试 Demo 中处理过权限方面的问题,当时的权限判断都是自己来处理的,不够灵活方便,封装的还远远不够,这次和尚初步尝试一下 RxPermissionsRx 系列大大优化了我们的代码。

应用权限

根据谷歌官网中定义,应用权限分为安全权限与危险权限,安全权限可直接在 AndroidManifest.xml 中申请即可;而危险权限在 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。 危险权限组主要包括:日历 / 相机 / 接触 / 定位 / 麦克风 / 手机电话 / 传感器 / 短信 / 存储,等几类:

集成方式

  1. build.gradle 中添加 implementation 'com.github.tbruyelle:rxpermissions:0.10.2';如果想要尝试使用 RxView 时再添加 implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1'
  2. AndroidManifest.xml 中申请需要的权限,这一步很简单,但也请不要忘记,否则如果对多个权限进行判断时,没有申请的权限不会进行判断;
  3. 在 Java/Kotlin 代码中使用 RxPermissions 进行动态权限申请;官网提供的方式和尚理解为两大类,一类是直接在需要的地方调用 request… 方式,另一种是 Disposable compose 方式;而每一类中又包含了三种方式,每种方式如果只对单一权限进行动态判断并无差别,但对于多个权限稍有不同,和尚逐个测试说明:

3.1 request 方式: 有几个权限申请对应弹几个通知框,只有多有对通知窗口都【允许】或【拒绝】处理完之后才会进入判断,是否权限被打开;重新进入本页面时会保留上一次处理过之后对状态;通过手机设置 -> 权限管理 中相关权限更改为提醒时,进入应用才会重新弹框。

代码语言:javascript
复制
new RxPermissions(this)
    .request(permission.CAMERA, permission.READ_PHONE_STATE)
    .subscribe(granted -> {
        if (granted) {
            Log.e(TAG, "所有权限都已打开!");
        } else {
            Log.e(TAG, "至少有一个权限被禁止!");
        }
    });

3.2 ensure 方式 ensure 方式的效果与 request 相同,一般会配合 RxView 共同使用。

代码语言:javascript
复制
RxView.clicks(findViewById(R.id.work_btn))
    .compose(rxPermissions.ensure(permission.CAMERA, permission.READ_PHONE_STATE))
    .subscribe(granted -> {
        if (granted) {
            Log.e(TAG, "所有权限都已打开!");
        } else {
            Log.e(TAG, "至少有一个权限被禁止!");
        }
    });

3.3 requestEach 方式 这种方式可以跟踪具体哪个权限被允许和拒绝,这个可以方便有针对性的处理;同样会记录上一次的状态;通过手机设置 -> 权限管理 中相关权限更改为提醒时,进入应用才会重新弹框。

代码语言:javascript
复制
rxPermissions
    .requestEach(permission.CAMERA, permission.READ_PHONE_STATE)
    .subscribe(permission -> {
        if (permission.granted) {
            Log.e(TAG, permission.name + "权限被授予!");
        } else if (permission.shouldShowRequestPermissionRationale) {
            Log.e(TAG, permission.shouldShowRequestPermissionRationale + "");
        } else {
            Log.e(TAG, permission.name + "权限被禁止!");
        }
    });

3.4 ensureEach 方式 ensureEach 方式的效果与 requestEach 相同,一般会配合 RxView 共同使用。

代码语言:javascript
复制
RxView.clicks(findViewById(R.id.work_btn))
    .compose(rxPermissions.ensureEach(permission.CAMERA, permission.READ_PHONE_STATE))
    .subscribe(permission -> {
        if (permission.granted) {
            Log.e(TAG, permission.name + "权限被授予!");
        } else if (permission.shouldShowRequestPermissionRationale) {
            Log.e(TAG, permission.shouldShowRequestPermissionRationale + "");
        } else {
            Log.e(TAG, permission.name + "权限被禁止!");
        }
    });

3.5 requestEachCombined 方式 和尚的理解是这种方式已权限组的方式进行判断,只有全部都允许才进入 (permission.granted) 权限授予判断,全部禁止或部分允许会进入权限禁止判断,实际上部分允许的权限已被打开。

代码语言:javascript
复制
rxPermissions
    .requestEachCombined(permission.CAMERA, permission.READ_PHONE_STATE)
    .subscribe(permission -> {
        if (permission.granted) {
            Log.e(TAG, permission.name + "所有的权限都被授予!");
        } else if (permission.shouldShowRequestPermissionRationale) {
            Log.e(TAG, permission.name + "至少有一个权限不会被提示!");
        } else {
            Log.e(TAG, permission.name + "权限被禁止!");
        }
    });

3.6 ensureEachCombined 方式 ensureEachCombined 方式的效果与 requestEachCombined 相同,一般会配合绑定具体的控件共同使用。

代码语言:javascript
复制
RxView.clicks(findViewById(R.id.work_btn))
    .compose(rxPermissions.ensureEachCombined(permission.CAMERA, permission.READ_PHONE_STATE))
    .subscribe(permission -> {
        if (permission.granted) {
            Log.e(TAG, permission.name + "所有的权限都被授予!");
        } else if (permission.shouldShowRequestPermissionRationale) {
            Log.e(TAG, permission.name + "至少有一个权限不会被提示!");
        } else {
            Log.e(TAG, permission.name + "权限被禁止!");
        }
    });

注意事项

  1. 需要动态处理的权限一定要在 AndroidManifest.xml 中进行申请;
  2. 应用程序可能在权限请求期间重新启动,即通过手机设置动态修改权限状态;因此请求必须在初始化阶段完成。这可能是 Activity.onCreateView.onFinishInflate,但不能在 onResume 等方法,因为可能会创建一个无限的请求循环。

和尚也是初步尝试,有不对的地方烦请提醒。以下是和尚公众号,欢迎闲来吐槽~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿策小和尚 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 应用权限
  • 集成方式
  • 注意事项
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档