Android Rx家族之RxPermission 权限管理神器 兼容99%手机

本文深入解析RxPermissions框架,介绍其实现原理与应用场景。通过对比普通权限申请方式,展示RxPermissions如何简化Android6.0以上设备的动态权限处理流程。涵盖框架构造、权限申请、结果反馈等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对比:用普通的方式和用RxPermission差异

 

RxPermissions实现原理:

构造方法挺容易理解的,就是初始化RxPermissionsFragment,我们所有的权限申请、

回调都是在这个Fragment中实现的,这也是RxPermissions框架最主要的部分,一切都是围绕这个展开的。

 

在上面我们讲过onRequestPermissionsResult这个方法是处理权限返回时候具体逻辑的,在这里我们就见到了吧。

该框架向外部暴露了一个onRequestPermissionsResult的重载方法,在这个方法中定义了一个PublishSubject,它将每个权限封装为Permission实体类,然后将它发出给订阅它的观察者进行处理。本篇暂时不讲Rxjava的用法。 我暂且认为大家都会Rxjava了。

让我们继续看,isGranted方法。在这个方法中我们看到了一个熟悉的方法checkSelfPermission,说明它是在这个方法中开始的权限申请。

 

RxPermissionsFragment在fragment中进行权限的申请和结果反馈。

 

RxPermission:

     用于适配Android 6.0新的权限模型的开源框架。官方解释 ,也就是说它是基于Rxjava的动态权限框架。

1)直接申请权限使用

 

RxPermissions.getInstance(this)
        .request(permissions)
.subscribe(new Action1<Boolean>() {
    @Override
    public void call(Boolean granted) {
        if (granted) { // 在android 6.0之前会默认返回true
            // 已经获取权限
            String jpgPath = getCacheDir() + "test.jpg";
            takePhotoByPath(jpgPath, 2);
        } else {
            // 未获取权限
            Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show();
        }
    }
});

这里直接返回是否授权,我们可以根据这个值进行不同的处理。

 

2.)条件触发获取权限(结合RxBinding使用)===单独申请一个权限

RxView.clicks(findViewById(R.id.request_permission))
           .compose(RxPermissions.getInstance(this).ensure(Manifest.permission.CAMERA))
           .subscribe(new Action1<Boolean>() {
       @Override
       public void call(Boolean granted) {

           if (granted) { // 在android 6.0之前会默认返回true
               // 已经获取权限
               String jpgPath = getCacheDir() + "test.jpg";
               takePhotoByPath(jpgPath, 2);
           } else {
               // 未获取权限
               Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show();
           }
       }
   });

3).同时请求多个权限

比如同时申请拍照和录音权限

RxPermissions.getInstance(MainActivity.this).request(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
    .subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean granted) {
            if (granted) { // 在android 6.0之前会默认返回true
                // 已经获取权限
                String jpgPath = getCacheDir() + "test.jpg";
                takePhotoByPath(jpgPath, 2);
            } else {
                // 未获取权限
                Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show();
            }
        }
    });

注意:如果同时请求多个权限,下面这种方式会合并请求结果,即所有权限请求成功会返回true,若有一个权限未成功则返回false

4).同时请求多个权限(分别获取结果)

同时请求多个权限(分别获取结果)

RxPermissions.getInstance(MainActivity.this).request(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
    .subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean granted) {
            if (granted) { // 在android 6.0之前会默认返回true
                // 已经获取权限
                String jpgPath = getCacheDir() + "test.jpg";
                takePhotoByPath(jpgPath, 2);
            } else {
                // 未获取权限
                Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show();
            }
        }
    });

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值