android——RxPermissions获取运行时权限

Android6.0+添加了运行时权限分为两类:
一类是Normal Permissions,这类权限不涉及个人隐私,不需要用户进行授权,比如手机震动,访问网络;
一类是Dangerous Permissions,这类权限涉及个人隐私,需要用户进行授权,比如读取SD卡,访问通讯录等。

Android6.0 普通做法就是一个个去判断,这个当然太麻烦。 这里给出一个不错的第三方库, 使用超级简单,我们直接调用方法,几乎可以忽略一切需要自己处理的东西。
RxPermissions 网址 https://github.com/tbruyelle/RxPermissions

使用:

在app的buildgradle文件中添加依赖:

   compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
    //RxJava2
    compile "io.reactivex.rxjava2:rxjava:2.0.0"

单个权限使用 拨打电话为例

 button1_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                RxPermissions rxPermissions = new RxPermissions(TimeActivity.this);
                // 添加所需权限
                rxPermissions.request(Manifest.permission.CALL_PHONE)
                        .subscribe(new Observer<Boolean>() {
                            @Override
                            public void onSubscribe(Disposable d) {

                            }

                            @Override
                            public void onNext(Boolean value) {
                                if (value) {
                                    Toast.makeText(TimeActivity.this, "同意权限 去打电话逻辑", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(TimeActivity.this, "拒绝权限", Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onComplete() {

                            }
                        });
            }
        });

注意:若 添加权限事找不到* 该权限 会爆红* 要引入的 为

import android.Manifest;

多个权限使用一起返回 拍照和录音权限为例

 button3_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // 多个权限用"," 隔开
                RxPermissions rxPermissions2 = new RxPermissions(TimeActivity.this);
                rxPermissions2.request(
                        Manifest.permission.CAMERA,
                        Manifest.permission.RECORD_AUDIO)
                        .subscribe(new Observer<Boolean>() {
                            @Override
                            public void onSubscribe(Disposable d) {
                                Log.i(TAG, "onSubscribe");
                            }
                            @Override    
                            public void onNext(Boolean value) {
                                //  value 为ture  说明权限都开启,只要所请求权限有一个为关闭 ,则为false  
                                if (value) {
                                    Toast.makeText(TimeActivity.this, " 去打开相机逻辑 ", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(TimeActivity.this, "拒绝权限", Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onError(Throwable e) {
                                Log.i(TAG, "onError_" + e.toString());
                            }

                            @Override
                            public void onComplete() {
                                Log.i(TAG, "onComplete");
                            }
                        });



            }
        });

多个权限使用逐个返回 拍照和录音权限为例
和一起返回的区别 new Consumer<>()
用一个数组去保存 识别哪些返回 注意 accept()调用次数和需要申请的权限个数有关 。需要处理 返回结果 这里 return 无效

// 成员变量 用来保存申请权限返回识别,方便做处理 长度和请求个数有关 
  final boolean[] isPermissionType = {false, false};
 button2_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RxPermissions rxPermissions = new RxPermissions(TimeActivity.this);

                //分别申请多个权限
                //分别申请多个权限时,使用requestEach
                rxPermissions.requestEach(
                        Manifest.permission.CAMERA,
                        Manifest.permission.RECORD_AUDIO) // 和一起返回区别
                        .subscribe(new Consumer<Permission>() {
                            @Override
                            public void accept(Permission permission) throws Exception {
                                Log.i("permissions", "回调次数   ?????");
                                if (permission.name.equals(Manifest.permission.CAMERA)) {
                                    //当RECORD_AUDIO 权限获取成功时,permission.granted=true
                                    Log.i("permissions", Manifest.permission.CAMERA + ":" + permission.granted);
                                    isPermissionType[0] = permission.granted;
                                    if (!isPermissionType[0]) {
                                        Toast.makeText(TimeActivity.this, "拒绝权限 +CAMERA ", Toast.LENGTH_SHORT).show();
                                        return;
                                    }
                                }

                                if (permission.name.equals(Manifest.permission.RECORD_AUDIO)) {
                                    //当CAMERA权限获取成功时,permission.granted=true
                                    Log.i("permissions", Manifest.permission.RECORD_AUDIO + ":" + permission.granted);
                                    isPermissionType[1] = permission.granted;

                                    // 如果上一个权限没开 ,就不再提示第二个, 若不处理 所有请求的没开权限 都会提示
                                    if (!isPermissionType[0]) {

                                    } else {
                                        if (!isPermissionType[1]) {
                                            Toast.makeText(TimeActivity.this, "拒绝权限 + RECORD_AUDIO ", Toast.LENGTH_SHORT).show();
                                            return;
                                        }
                                    }
                                }

                                if (isPermissionType[0] && isPermissionType[1]) {
                                    Toast.makeText(TimeActivity.this, " 去打开相机逻辑", Toast.LENGTH_SHORT).show();
                                }
                            }
                        });

                // 多个权限用逗号隔开
            }
        });

使用就是这么简单 使用逐个返回时候 ,和guthub 给出的有点区别 这个 rxjava 有关。 需要注意区分

new Action1<Boolean>() //rxjava1 为 
new Consumer<Permission>() //rxjava2  
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值