Android 6.0运行时权限第三方库的使用-----RxPermissions
运行时权限的讲解在前一篇博客已经算是说的比较清楚了,这里就不说了,如果对6.0这个新特性不是很了解的朋友建议先看看(地址:http://blog.csdn.net/qq_33923079/article/details/53428756),那么本篇就直接说怎么使用第三方开源库了,本人通过实践比较觉得PxPermissions这个开源库好用,这里就是他的使用说明书了。当然你可以去Github上搜索PxPermissions去查看源码学习,或者查看作者自己的使用说明。
当然这里也给出地址:
https://github.com/tbruyelle/RxPermissions
下面开始正题:
首先是RxPermission库的引入,通过添加依赖即可:
在app的buildgradle文件中添加依赖:
dependencies {
...
//RxPermissions
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
//RxJava2
compile "io.reactivex.rxjava2:rxjava:2.0.0"
}
也可以在Project Strcuture里搜索这个依赖库,直接添加。
由于Rxjava的巨大优势和RxPremissions的优秀封装使用起来非常方便
RxPermissions rxPermissions = new RxPermissions(MainActivity.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(MainActivity.this, "同意权限", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this, "拒绝权限", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
如果需要同时生气多个权限并且要分别判断权限是否授予,可以使用如下写法:
RxPermissions rxPermission = new RxPermissions(getActivity());
rxPermission
.requestEach(Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_CALENDAR,
Manifest.permission.READ_CALL_LOG,
Manifest.permission.READ_CONTACTS,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_SMS,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.CAMERA,
Manifest.permission.CALL_PHONE,
Manifest.permission.SEND_SMS)
.subscribe(new Consumer<Permission>() {
@Override
public void accept(Permission permission) throws Exception {
if (permission.granted) {
// 用户已经同意该权限
Log.d(TAG, permission.name + " is granted.");
} else if (permission.shouldShowRequestPermissionRationale) {
// 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框
Log.d(TAG, permission.name + " is denied. More info should be provided.");
} else {
// 用户拒绝了该权限,并且选中『不再询问』
Log.d(TAG, permission.name + " is denied.");
}
}
});
我还能说什么,真的是已经很简洁了,相比其他AndPremission和PremissionGen的有些缺陷和相对复杂的逻辑判断,我要说:这是我见过最简洁的运行时权限的写法了。当然如果你使用lambda表达式的会更简洁:
RxPermissions rxPermissions = new RxPermissions(MainActivity.this);
rxPermissions
.request(Manifest.permission.CALL_PHONE)
.subscribe(granted -> {
if (granted) {
Toast.makeText(MainActivity.this, "同意权限", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "拒绝权限", Toast.LENGTH_SHORT).show();
}
});
我只想说,Premission遇到RxJava那就是Android界的一大福音啊,简直就是十月革命一声枪响,给我们送来马克思主义啊。
综合这两篇博客,我们可以看到运行时权限无非就是:权限判断,权限申请,授权监听,有权逻辑,无权提示这五步。代码量是比以前增加不少,还好危险权限相对不多,也可以集中申请,用时判断;再考虑到Android的每一次进步,都对我们开发者虽然眼前吃点苦,但长期来看也是有很大好处的,也就可以很愉快地接受了这个现实。
关于复杂业务场景权限判断的思考
以上实例是在处理单个或单一权限组的权限申请,也对应着一个权限逻辑,这并不意味每次危险权限都要单独执行上面的几步;其实可以只申请一次,然后针对不同权限执行不同的操作。如果是一次权限申请对应不同的权限逻辑,用户可能未授予全部权限,导致部分权限操作可以执行,部分不行,这里AndPermission也留了很好的扩展空间,在涉及到权限的方法里都有String[] permissions或者List grantedPermissions这样的权限数组和集合,从而实现针对对单个权限执行特殊操作。
结束语
有了RxPermissions,就可以直接秒杀6.0的这个新特性了。另外关于PermissionGen的失败回调,以及AndPermission的Fragment部分机型无法接收回调的事情,我只想说,希望国内的大牛再接在励,我们这些小辈也是要动劲了。
ok,运行时权限通过就说到这里吧。
Android 6.0运行时权限第三方库的使用-----RxPermissions的更多相关文章
- Android权限管理之Android 6.0运行时权限及解决办法
前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...
- Android 6.0+ 运行时权限
1.权限被分为了普通和危险两种 2.打电话的Demo import android.Manifest; import android.app.Activity; import android.cont ...
- Android 6.0 运行时权限处理完全解析
一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...
- 谈谈Android 6.0运行时权限理解
前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...
- Android 6.0 运行时权限处理问题
序 自从升级到Android M以来,最大的改变就是增加了运行时权限RuntimePermission,6.0以上的系统如果没有做适配,运行了targetSDK=23的App时就会报权限错误.我们知道 ...
- Android 6.0 运行时权限处理完全解析 (摘抄)
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...
- Android数据存储之Android 6.0运行时权限下文件存储的思考
前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...
- android-详解Android 6.0运行时权限
感谢郭神,从Android 6.0开始,不再是安装应用时用户确定获得全部的权限.而是在使用软件过程中需要该权限时,弹出对话框让用户选择权限.不仅如此,用户选择权限后还可以关闭. 检查是否获得权限 通过 ...
- Android 6.0运行时权限
一.Runtime Permissions Android 6.0在手机安全方面做的一个处理就是增加了运行时权限(Runtime Permissions). 新的权限机制更好的保护了用户的隐私,Goo ...
随机推荐
- Spring 事务机制详解(事务的隔离性和传播性)
原文出处: 陶邦仁 Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考. Spring声明式事务让我们从复杂的事务处理中得到 ...
- iOS 多线程之 NSThread的基本使用
一个NSThread对象就代表一条线程 下面是NSThread开启线程的方法 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEv ...
- mysql 5.7.18版本 sql_mode 问题
only_full_group_by 模式的,但开启这个模式后,原先的 group by 语句就报错,然后又把它移除了. only_full_group_by ,感觉,group by 将变成和 di ...
- Python3.6全栈开发实例[007]
7.此函数只接收一个参数且此参数必须是列表数据类型,此函数完成的功能是返回给调用者一个字典,此字典的键值对为此列表的索引及对应的元素.例如传入的列表为:[11,22,33] 返回的字典为 {0:11, ...
- Java输入输出重定向代码
try { BufferedInputStream in = new BufferedInputStream(new FileInputStream("input.txt")) ...
- “格式化HDFS后,HMaster进程启动失败”的问题解决
用 hadoop namenode -fromat 格式化后,用./start-hbase.sh 启动HMaster和HRegionServer,但是过几秒种后HMaster进程自动关闭,HRegio ...
- SpringBoot连接PostgreSQL
这个 org.postgresql.jdbc.PgConnection.createClob() 方法尚未被实作 application.properties spring.datasource.pl ...
- 使用openresty + lua 搭建api 网关(一)安装openresty ,并添加lua模块
openresty 有点不多说,网上各种介绍,先安装吧. 官方操作在此,http://openresty.org/cn/installation.html, tar -xzvf openresty-V ...
- 剑指offer 面试64题
题目:64题 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 解法一:利用Python特性 # -*- ...
- request doesn't contain a multipart/form-data or multipart/mixed stream ……
有文件控件"file"的表单,在提交的时候,直接使用了ajax提交,结果报了一堆错,原来这个东东要提交表单,还要用post方式,最后更改为: $("#saveForm&q ...