欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android开发RxPermissions获取运行时权限方法

程序员文章站 2022-05-07 22:05:31
android开发rxpermissions获取运行时权限方法,android6.0+添加了运行时权限分为两类: 一类是normal permissions,这类权限不涉及个人隐...

android开发rxpermissions获取运行时权限方法,android6.0+添加了运行时权限分为两类:
一类是normal permissions,这类权限不涉及个人隐私,不需要用户进行授权,比如手机震动,访问网络;
一类是dangerous permissions,这类权限涉及个人隐私,需要用户进行授权,比如读取sd卡,访问通讯录等。

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

使用:

在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() {
                            @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() {
                            @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() {
                            @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() //rxjava1 为 
new consumer() //rxjava2