传说Android 7.0的市场占有率终于1%了,Android 6.0基本上人人有了。这个时候,我不得不把软件开发的SDK目标版本提升到了23。这是就要考虑实现权限的动态分配了。基于我项目用使用了RxJava,所以我就选择了RxPermissions框架来实现权限的动态分配。

一、了解权限

  权限分两种:普通权限、危险权限。普通权限在AndroidManifest.xml声明就可以了,危险权限在AndroidManifest.xml声明之后,还需要在软件运行的时候,动态的获取。目前危险权限一共有26个,其他的都是普通权限。
  Dangerous Permissions 共有26个:

group:android.permission-group.CAMERA
  permission:android.permission.CAMERA

group:android.permission-group.SENSORS
  permission:android.permission.BODY_SENSORS

group:android.permission-group.MICROPHONE
  permission:android.permission.RECORD_AUDIO

group:android.permission-group.CALENDAR
  permission:android.permission.READ_CALENDAR
  permission:android.permission.WRITE_CALENDAR

group:android.permission-group.LOCATION
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.READ_CONTACTS

group:android.permission-group.SMS
  permission:android.permission.READ_SMS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.SEND_SMS
  permission:android.permission.READ_CELL_BROADCASTS

group:android.permission-group.PHONE
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:com.android.voicemail.permission.ADD_VOICEMAIL

android.permission.ANSWER_PHONE_CALLS

  一共九大分组,每个分组只要申请其中一个权限,其他权限都可以获得。最后一个是Android 8.0新添加的权限,是限制接听来电的权限。如果想查看其他权限可以查看访问权限API。

二、RxPermissions

在GitHub上的地址是:https://github.com/tbruyelle/RxPermissions。
  现在主要有两个分支,如下图:

  2.x分支是基于RxJava2的源码。master是基于Rxjava的源码。不管是RxJava、RxJava2对RxPermissions的使用没有影响,只是导入的依赖不一样。
  RxJava、RxJava2导入的依赖分别是:

compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'

RxPermissions的使用

1、minSdkVersion 必须大于等于11.

2、在build.gradle中配置。

如果没有的话,添加这个。

android {repositories {jcenter() // If not already there}
}

再添加依赖:
基于RxJava

dependencies {compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
}

基于RxJava2

dependencies {compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
}

3、初始化

RxPermissions rxPermissions = RxPermissions.getInstance(this);

4、使用方法

申请一个权限的方法:

// 假如申请调用系统拍照
rxPermissions.request(Manifest.permission.CAMERA).subscribe(new Subscriber<Boolean>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(Boolean aBoolean) {// aBoolean:true开启成功 false开启失败}
});

申请多个权限的方法:

rxPermissions.request(Manifest.permission.CAMERA,Manifest.permission.ACCESS_FINE_LOCATION).subscribe(new Subscriber<Boolean>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(Boolean aBoolean) {// aBoolean:true开启成功 false开启失败// 只要有一个权限申请失败,就返回false}
});

申请权限并查看申请结果的详细信息:

rxPermissions.requestEach(permissions).subscribe(new Subscriber<Permission>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(Permission permission) {if (permission.granted) {Log.e("申请成功:",permission.name);} else if (permission.shouldShowRequestPermissionRationale) {Log.e("申请取消:",permission.name);} else {Log.e("申请失败:",permission.name);}}});

  这个方法,是实现返回每个权限申请的结果。返回的是Permission 类。包含权限申请结果,包含:permission.granted表示申请成功;permission.shouldShowRequestPermissionRationale表示申请取消;如果这两个都不是,表示申请被拒绝,只能在设置界面手动开启。跳转至系统设置界面的方法:

/*** 获取应用详情页面intent*/
private void getAppDetailSettingIntent() {Intent localIntent = new Intent();localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (Build.VERSION.SDK_INT >= 9) {localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");localIntent.setData(Uri.fromParts("package", getPackageName(), null));} else {localIntent.setAction(Intent.ACTION_VIEW);localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());}startActivity(localIntent);mContext.overridePendingTransitionEnter();
}

   github还提到了ensure、ensureEach 方法。也分别对应了返回的简单结果和详细结果。这两个方法是实现view绑定权限请求的框架RxBinding时使用的,RxBinding是要结合RxPermission使用的。RxBinding的GitHub地址
  权限的请求方法,最好写在onCreate()方法里,这样在启动界面的时候,会先检测权限信息。

Android 6.0以上运行权限及RxPermissions的使用相关推荐

  1. Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架

    Android6.0执行时权限解析,RxPermissions的使用.自己封装一套权限框架 在Android6.0中,新添加了一个执行时的权限,我相信非常多人都已经知道了.预计也知道怎么用了,这篇博客 ...

  2. 谈谈Android 6.0 的动态权限管理

    Android适配系列: Android 6.0 的动态权限管理 Android 7.0脱坑指南 Android 8.0适配指北 Android 9.0 适配指南 1.前言 大家都知道Android ...

  3. android 动态获取权限有哪些,Android 6.0+ 动态获取权限

    Android 6.0+ 动态获取权限 这里有一个现成的库,可以直接拿来用.方便简单 1.向app下的gradle添加依赖: dependencies{ // android 6.0+ 动态获取权限 ...

  4. Android 9.0模拟器root权限获取

    Android 9.0在获取权限时报如下错误 remount of the / superblock failed: Permission denied remount failed 解决方法为: 1 ...

  5. 聊一聊Android 6.0的运行时权限

    Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发 ...

  6. 安卓从业者应该关注:Android 6.0的运行时权限

    Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发 ...

  7. Android 8.0后台运行策略学习

    本文主要是对谷歌开发者官方微信公众号发布的[中文教学视频]Android Oreo 中的后台进程等文章的学习记录. 概览 Service限制 前台应用的定义 影响所有后台Service 针对Servi ...

  8. Android 7.0 SEAndroid app权限配置

    1.SEAndroid app分类 SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型): 1)untrusted_app  第三方app, ...

  9. Android内容提供器——运行权限

    程序运行是的权限分为两种,一种是普通权限,一种是危险权限.普通权限的话可以直接使用,只有危险权限需要询问用户的同意. 危险权限分组以及组内权限如下: 注:危险权限同一组内有一项权限被授权,则一组权限都 ...

最新文章

  1. MATLAB【六】 ———— matlab 随机散斑模拟
  2. 用计算机制作演示文稿教案博客,制作演示文稿 教学反思
  3. nyist --- 组队赛(四)
  4. 如何删除 Windows.old 文件夹
  5. Eureka出现Root name ‘timestamp‘ does not match expected (‘instance‘) for type xxx的错误,如何解决?
  6. QML基础类型之enumeration
  7. ES2017异步函数现已正式可用
  8. Linux 命令行通配符及转义符的实现
  9. Navicat Premium 12安装过程和相关资源
  10. Linux常用的基本命令10
  11. win11打开控制面板闪退怎么办 Windows11控制面板闪退的解决方法
  12. mfc 学习的第二天
  13. java a =a-=aa_java 初学 :求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。几个 数相加由键盘控制。...
  14. 图像处理PILLOW的使用
  15. java怎样用类模板创建对象_java入门(十四) | 面向对象(OOP)之类和对象
  16. 关于MacOS升级10.13系统eclipse菜单灰色无法使用解决方案
  17. git2.23.0下载git2.25.0下载git2.27.0下载百度云
  18. 【读书】2020年阅读记录
  19. java 二维码原理以及用java实现的二维码的生成、解码
  20. 一个常用的电池包电压检测电路

热门文章

  1. node服务:日志、配置、路由与控制器
  2. 【项目管理和构建】——Maven简介(一)
  3. centos中的配置文件
  4. Elasticsearch java api(五) Bulk批量索引
  5. Java的ClassLoader
  6. 基本概率模型和贝叶斯定理
  7. spark RDD创建方式:parallelize,makeRDD,textFile
  8. unity中实现简单对象池,附教程原理
  9. 机器学习资料合计(二)
  10. spero性能调优记录