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 ...
随机推荐
- cvs 文件如何解析?
QList<QStringList> RwCvs::readToList(const QString &path, const QString separator) { QList ...
- mysql设计表结构数据类型的选择
选择合适的数据类型 在使用MySQL创建数据表的时候会遇到一个问题,如何为字段选择合适的数据类型.比如创建一个员工信息表,每个字段都可以用很多种类型来定义, int,char,float等等. cha ...
- “格式化HDFS后,HMaster进程启动失败”的问题解决
用 hadoop namenode -fromat 格式化后,用./start-hbase.sh 启动HMaster和HRegionServer,但是过几秒种后HMaster进程自动关闭,HRegio ...
- ShutIt:一个基于 Python 的 shell 自动化框架
ShutIt是一个易于使用的基于shell的自动化框架.它对基于python的expect库(pexpect)进行了包装.你可以把它看作是“没有痛点的expect”.它可以通过pip进行安装. Hel ...
- android密码显示和隐藏
if (showPwd){ //设置EditText文本为可见的 password.setTransformationMethod(HideReturnsTransformationMethod.ge ...
- notepad++自动补全
菜单栏中的语言,选择想要的语言,就能看到代码补全了,设置是更改主题的 添加注释快捷键 ctrl+Q
- LeetCode:罗马数字转整数【13】
LeetCode:罗马数字转整数[13] 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 10 ...
- JQuery 获取父元素方法
---恢复内容开始--- <tr class="removerow" style=""> <td> <input type=&qu ...
- c# 虚方法(virtual)与 多态(Polymorphism)
using System; using System.Collections.Generic; using System.Linq; using System.Text; //虚方法(virtual) ...
- Linux用户和用户组管理 用户管理相关命令
用户添加命令 useradd 注意: 新添加的用户如果不设定密码是不能够登录系统的 命令格式: [root@localhost ~]#useradd [选项] 用户名 选项说明: 选项 选项说明 -u ...