当前位置: 首页 > news >正文

【Android -- 开源库】权限适配 RxPermissions 的基本使用

在这里插入图片描述

运行时权限

从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。

系统权限分为两类:

  • 正常权限:只需在你应用的 Androidmanifest.xml 中列出,安装时授权。
  • 危险权限:需要在你应用的 Androidmanifest.xml 中列出,并在运行时授权。

如需了解更多关于正常权限与危险权限可以参阅这里。

关于 Android 6.0 运行时权限的详细讲解可以看这篇文章和官方文档。

RxPermissions

RxPermissions 能配合 RxJava 与新的 Android M 权限模型一起使用,用于处理 Android 运行时权限。

GitHub 地址:https://github.com/tbruyelle/RxPermissions

一、集成说明

在 app 模块下的 build.gradle 添加下面配置:

compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
compile 'io.reactivex:rxjava:1.1.3'

二、使用说明

1. 在清单文件中,添加 Dangerous Permissions

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />

2. 申请单个权限

        //请求单个权限
        btn_request.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //这个请求事件我写在点击事件里面,
                //点击button之后RxPermissions会为我们申请运行时权限
                RxPermissions.getInstance(MainActivity.this)
                        .request(Manifest.permission.READ_CALENDAR)//这里填写所需要的权限
                        .subscribe(new Action1<Boolean>() {
                            @Override
                            public void call(Boolean aBoolean) {
                                if (aBoolean) {//true表示获取权限成功(注意这里在android6.0以下默认为true)
                                    Log.i("permissions", Manifest.permission.READ_CALENDAR + ":" + 获取成功);
                                } else {
                                    Log.i("permissions", Manifest.permission.READ_CALENDAR + ":" + 获取失败);
                                }
                            }
                        });
            }
        });

效果图
在这里插入图片描述

3. 申请多个权限

//同时请求多个权限
RxPermissions.getInstance(MainActivity.this)
                        .request(Manifest.permission.RECEIVE_MMS,
                                Manifest.permission.READ_CALL_LOG)//多个权限用","隔开
                        .subscribe(new Action1<Boolean>() {
                            @Override
                            public void call(Boolean aBoolean) {
                                if (aBoolean) {
                                    //当所有权限都允许之后,返回true
                                    Log.i("permissions", "btn_more_sametime:" + aBoolean);
                                } else {
                                    //只要有一个权限禁止,返回false,
                                    //下一次申请只申请没通过申请的权限
                                    Log.i("permissions", "btn_more_sametime:" + aBoolean);
                                }
                            }
                        });

效果图
在这里插入图片描述
4. 同时请求多个权限

//分别申请多个权限
RxPermissions.getInstance(MainActivity.this)
                          //分别申请多个权限时,使用requestEach
                        .requestEach(Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.RECORD_AUDIO,
                                Manifest.permission.CAMERA)
                        .subscribe(new Action1<Permission>() {
                            @Override
                            public void call(Permission permission) {
                                if (permission.name.equals(Manifest.permission.ACCESS_FINE_LOCATION)) {
                                     //当ACCESS_FINE_LOCATION权限获取成功时,permission.granted=true
                                    Log.i("permissions", Manifest.permission.ACCESS_FINE_LOCATION + ":" + permission.granted);
                                }
                                if (permission.name.equals(Manifest.permission.RECORD_AUDIO)) {
                                     //当RECORD_AUDIO 权限获取成功时,permission.granted=true
                                    Log.i("permissions", Manifest.permission.RECORD_AUDIO + ":" + permission.granted);
                                }
                                if (permission.name.equals(Manifest.permission.CAMERA)) {
                                     //当CAMERA权限获取成功时,permission.granted=true
                                    Log.i("permissions", Manifest.permission.CAMERA + ":" + permission.granted);
                                }
                            }
                        });

效果图
在这里插入图片描述

相关文章:

  • Unity-TCP-网络聊天功能(二): 登录与注册
  • 51单片机最强模块化封装(1)
  • Python学习-----起步2(变量与转义符)
  • Java程序设计实验3 | 面向对象(上)
  • 优秀的代码最终选择if else,还是switch case
  • Openharmony的编译构建--进阶篇1
  • 每天一道大厂SQL题【Day02】电商场景TopK统计
  • EMT4J详细介绍与使用,帮你找到Java版本升级带来的问题,让你在项目jdk升级不在头疼
  • 第2章:使用CSS定义样式
  • 【数据结构】动图详解单向链表
  • MySQL基础篇笔记
  • Vue3现状—必然趋势?
  • uniapp获取支付宝user_id - 支付宝提现 - 登录授权 - APP支付宝登陆 - H5支付宝授权
  • Promise详解与手写实现
  • 【C++】类型转换
  • 关于栈和队列
  • 网络知识详解之:网络攻击与安全防护
  • Java快速上手Properties集合类
  • leetcode:43. 字符串相乘(附加一些C++string其他小练习)
  • 游戏SDK(三)架构设计之代码实现1
  • https://app.hackthebox.com/machines/Inject
  • Spring —— Spring简单的读取和存储对象 Ⅱ
  • 渗透测试之冰蝎实战
  • Mybatis、TKMybatis对比
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • 《谷粒商城基础篇》分布式基础环境搭建
  • 哈希表题目:砖墙
  • Vue 3.0 选项 生命周期钩子
  • 【车载嵌入式开发】AutoSar架构入门介绍篇
  • 【计算机视觉 | 目标检测】DETR风格的目标检测框架解读