传说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. Keep Walking!
  2. HTML中各种 div 位置距离关系
  3. php redis 传递闭包,通过缓存构建高性能 Laravel 应用
  4. Arduino笔记-温度传感器的使用
  5. Linux db2 4499,db2 連接 ERRORCODE=-4499, SQLSTATE=08001,解決辦法
  6. 我的docker随笔23:修改容器时区和添加中文支持
  7. xstart连不上linux_Xstart远程连接Linux图形用户界面
  8. ios中获取各种文件的目录路径方法
  9. Atitit attilax涉及到的大数据 数据分析 数据挖掘 ai人工智能的处理技术 目录 1.1. 大数据 机器视觉 图像处理 数据分析 数据挖掘 知识图谱 ai人工智能方面系列项目 1 2.
  10. 通过ADB命令打开MTK和展讯日志的方法
  11. MATLAB串口操作
  12. JPA、EJB、事物管理、WebSphere ---相关内容整理
  13. 【Hive】Hive练习题(三)
  14. OpenCV中文文档
  15. PyQt5:ToggleButton开关按钮(24)
  16. MuiPlayer - 一款优秀的 H5 视频播放器框架
  17. Juphoon RCS年度成绩单,请查收!
  18. 王思聪砸百万组装服务器,跑分全球第4
  19. Excel 金额大写
  20. 数据分析:大数据时代的必备技能之Tableau

热门文章

  1. C#二维数组的定义和初始化
  2. 安装虚拟机VMware12步骤
  3. Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser
  4. Elasticsearch技术解析与实战(五)Document解析
  5. Easy Scheduler 1.0.2 发布,分布式工作流任务调度系统
  6. 行为型模式:状态模式
  7. js操作样式自动prefix
  8. 资源集 - 收藏集 - 掘金
  9. MVC的实体模型写在类库,为什么被其他类库调用时,用不了模型的表?
  10. TP框架笔记 -- 394-model的创建