前言:动态权限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用户当前APP所需要的权限,防止滥用。这些权限一般分为三种:(1)普通权限:直接manifest清单文件中写上注册就行了 (2)危险权限:需要动态申请 (3)特殊权限:此处暂不说明。

注意:这里我们就按照原生,和git上比较出名的第三方权限管理工具,EasyPermissions和RxPermissions

一、参考

二、异常

异常:java.lang.SecurityException: getDeviceId: Neither user 10127 nor current process has android.permission.READ_PHONE_STATE.

解释:走到方法getDeviceId这里异常,缺失权限:READ_PHONE_STATE,先检查manifest.xml清单文件里有没有,没有补上,如果有,那么这个权限就得动态获取了。

三、流程

1、第一次询问权限 -》允许权限(再次询问同样权限也不会弹框,已注册)

2、第一次询问权限-》拒绝权限-》再次询问权限-》允许权限(再次询问同样权限也不会弹框,已注册)

3、第一次询问权限-》拒绝权限-》再次询问权限-》不再询问(再次询问同样权限也不会有弹框,直接拒绝)

--------------------几张图片说明--------------------

first_request.png

not_first_request.png

not_first_request_and_not_ask_again.png

四、实例

1、原生,比较长且繁琐,先理解下

/**

* 测试:原生动态权限管理

* */

private void testOrgPermission(){

//判断当前系统是否高于或等于6.0

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

//已注册权限

if (ContextCompat.checkSelfPermission(instance, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {

//todo something

LogUtil.i("testOrgPermission() : this camera permission is granted");

}

//未注册权限,申请权限

else {

// v4向下兼容:询问权限(这里可以一个,也可以多个)

// 拒绝权限后再次询问

LogUtil.i("testOrgPermission() : this camera premission is denied , " +

"ready to request this permission");

ActivityCompat.requestPermissions(instance,

new String[]{Manifest.permission.CAMERA},

REQUEST_PERMISSION_CAMERA_CODE);

}

}

//当前系统小于6.0,无需动态申请权限

else {

//todo something

}

}

/**

* 询问权限的回调函数

* */

@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

switch (requestCode){

case REQUEST_PERMISSION_CAMERA_CODE:

int cameraResult = grantResults[0];//相机权限

boolean cameraGranted = cameraResult == PackageManager.PERMISSION_GRANTED;//拍照权限

//注册权限

if (cameraGranted) {

LogUtil.i("onRequestPermissionsResult() : "+permissions[0]+

" request granted , to do something...");

//todo something

}

//拒绝注册权限

else {

//无权限,且被选择"不再提醒":提醒客户到APP应用设置中打开权限

if(!ActivityCompat.shouldShowRequestPermissionRationale(instance,Manifest.permission.CAMERA)){

LogUtil.e("onRequestPermissionsResult() : this "+permissions[0]+" is denied " +

"and never ask again");

ToastUtil.showShort(instance,"拒绝权限,不再弹出询问框,请前往APP应用设置中打开此权限");

//todo nothing

}

//无权限,只是单纯被拒绝

else{

LogUtil.e("onRequestPermissionsResult() : "+permissions[0]+"request denied");

ToastUtil.showShort(instance,"拒绝权限,等待下次询问哦");

//todo request permission again

}

}

break;

default:break;

}

}

2、EasyPermissions:挺简洁的

//build中依赖easypermissions

dependencies {

implementation 'pub.devrel:easypermissions:1.1.2'

}

#notice:这里要实现回调接口 Activity implements EasyPermissions.PermissionCallbacks

/**

* 测试:EasyPermission

* https://github.com/googlesamples/easypermissions

* */

private void testEasyPermission(){

String[] perms = {Manifest.permission.CAMERA};

if (EasyPermissions.hasPermissions(this, perms)) {

//todo something

LogUtil.i("testEasyPermission() : this camera permission is granted");

} else {

LogUtil.i("testEasyPermission() : this camera premission is denied , " +

"ready to request this permission");

EasyPermissions.requestPermissions(this, "你TM开相机权限啊!!",

REQUEST_PERMISSION_CAMERA_CODE, perms);

}

//自定义询问框内容部分,可试试看

// EasyPermissions.requestPermissions(

// new PermissionRequest.Builder(this, RC_CAMERA_AND_LOCATION, perms)

// .setRationale(R.string.camera_and_location_rationale)

// .setPositiveButtonText(R.string.rationale_ask_ok)

// .setNegativeButtonText(R.string.rationale_ask_cancel)

// .setTheme(R.style.my_fancy_style)

// .build());

}

@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

// Forward results to EasyPermissions

EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);

}

@Override

public void onPermissionsGranted(int requestCode, @NonNull List perms) {

//省略switch requestCode

LogUtil.i("EasyPermission CallBack onPermissionsGranted() : "+perms.get(0)+

" request granted , to do something...");

//todo somthing

}

@Override

public void onPermissionsDenied(int requestCode, @NonNull List perms) {

//省略switch requestCode

//无权限,且被选择"不再提醒":提醒客户到APP应用设置中打开权限

if (!ActivityCompat.shouldShowRequestPermissionRationale(instance, Manifest.permission.CAMERA)) {

LogUtil.e("EasyPermission CallBack onPermissionsDenied() : this " + perms.get(0) + " is denied " +

"and never ask again");

ToastUtil.showShort(instance, "拒绝权限,不再弹出询问框,请前往APP应用设置中打开此权限");

//todo nothing

}

//无权限,只是单纯被拒绝

else {

LogUtil.e("EasyPermission CallBack onPermissionsDenied() : " + perms.get(0) + "request denied");

ToastUtil.showShort(instance, "拒绝权限,等待下次询问哦");

//todo request permission again

}

}

3、RxPermissions:个人觉得更简洁,最好在activity的onCreate()中使用哦

//build中依赖rxjava,rxandroid和rxpermissions

dependencies {

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

compile 'io.reactivex.rxjava2:rxjava:2.0.1'

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

}

/**

* 测试:RxPermission

* https://github.com/tbruyelle/RxPermissions

* */

private void testRxPermission(){

RxPermissions rxPermissions = new RxPermissions(this); // where this is an Activity instance

rxPermissions

.requestEach(

Manifest.permission.CAMERA)

.subscribe(new Consumer() {

@Override

public void accept(Permission permission) throws Exception {

if (permission.granted) {

LogUtil.i("testRxPermission CallBack onPermissionsGranted() : "+permission.name+

" request granted , to do something...");

//todo somthing

}

else if (permission.shouldShowRequestPermissionRationale) {

LogUtil.e("testRxPermission CallBack onPermissionsDenied() : " + permission.name + "request denied");

ToastUtil.showShort(instance, "拒绝权限,等待下次询问哦");

//todo request permission again

}

else {

LogUtil.e("testRxPermission CallBack onPermissionsDenied() : this " + permission.name + " is denied " +

"and never ask again");

ToastUtil.showShort(instance, "拒绝权限,不再弹出询问框,请前往APP应用设置中打开此权限");

//todo nothing

}

}

});

}

其他自定义弹出框UI,多个权限询问等

原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)相关推荐

  1. Android pms权限管理,Android权限机制

    为什么有权限机制 我们知道 Android 应用程序是沙箱隔离的,每个应用都有一个只有自己具有读写权限的专用数据目录.但是如果应用要访问别人的组件或者一些设备上全局可访问的资源,这时候权限机制就能系统 ...

  2. android 获取权限管理,Android常用权限获取和设置

    Android常用权限获取和设置 1 活动管理器 权限 代码 ActivityManager activityManager = (ActivityManager) getSystemService( ...

  3. android 权限管理框架,Android 运行时权限管理最佳实践

    欢迎访问我的个人博客 传送门 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予.此方法可以简化应用安装过程,因为用户在安装或更新应用时不需 ...

  4. android 加网络权限管理,Android添加用户组及自定义App权限的方法

    Android:4.4.4 一.应用场景 在Android设备上,现在我们外接了一个USB转串口的设备,设备节点是/dev/ttyUSB0: # ls -l /dev/ttyUSB0 crw-rw-- ...

  5. Android 6.0: 动态权限管理的解决方案

    Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了用户体验, 同时也为程序员带来新的负担. 动态权限管理就是这样, 一方面让用户更加容易的控制自己的隐私, 一方面需要重新适配应 ...

  6. android superuser.apk 管理root权限原理分析

    原文出处:http://blog.163.com/szs121@126/blog/static/109056781201223111390835/ 使用android 手机很多情况下需要root权限, ...

  7. 麦克风android权限管理,android权限处理详解

    写在前面 对于android 6.0来说,增加了权限的管理,能够更好的保护用户的隐私,当用户需要某权限时,才动态的去申请.用户也可以在应用权限管理里面关闭和打开.为了方便以后使用,这里对权限使用相关做 ...

  8. android如何管理不同app,如何管理android手机中app的权限

    如何管理android手机中app的权限以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如何管理android手机中ap ...

  9. android 华为开发权限管理,android开发 华为 点击跳转到权限管理页面

    private void goHuaWeiSetting()  { try { //HUAWEI H60-l02 P8max测试通过 Log.d(MainActivity.class.getSimpl ...

最新文章

  1. 三点弯曲弹性模量怎么计算公式_拉力试验机常用力学计算公式
  2. [图示]话剧《被结婚时代》将剩女分4级
  3. LeetCode 1602. 找到二叉树中最近的右侧节点(BFS)
  4. 连网获取图片的小程序
  5. STM32F405 HAL库 STM32CUBE开发
  6. 路由跳转的时候地址栏的地址变了 但是页面不变_斐讯路由器如何设置上网 斐讯路由器设置上网方法【图文】...
  7. quartus仿真15:全加器和半加器及如何生成符号文件
  8. 小小知识点(十一)——MATLAB中fftshift的作用
  9. iOS TableView性能优化
  10. django1.6 mysql_如何在Django1.6结合Python3.4版本中使用MySql
  11. java缓存机制面试题,电子版已问世
  12. ctc decoder
  13. 【历史上的今天】1 月 6 日:“互联网之子”的陨落;微软云服务先驱出生;世界上第一台 5G 笔记本
  14. 设计模式之九原型模式
  15. azkaban 调度任务一直处于preparing状态
  16. Muli3D 3 qQuaternionRotationMatrix 函数 (矩阵转四元数)
  17. linux中Swap分区是做什么的?
  18. 【构成L1笔记:飞行道具】
  19. 工艺品娃娃和塑料娃娃的区别?
  20. linux sort 排序 1 99,Linux操作系统中排序命令Sort的使用方法

热门文章

  1. 4.0 编译apk中无classes.dex问题解决方法
  2. Vmare 15 安装 macOS 15.5 的关键步骤
  3. 【教女朋友学网络系列4】之今天教她一些简单的交换机实验
  4. 1616: 最长回文串(马拉车算法)
  5. 如何将实时计算 Flink 与自身环境打通?
  6. 玩转ECS第7讲 | ECS数据保护-数据备份新特性与最佳实践
  7. 阿里云MVP第14期全球发布:云时代2.0,遇见科技追梦者!
  8. Gradle 编译速度提升 70%!怎么做到的?
  9. 2020年7月编程语言排行榜来喽,R编程语言创历史最高纪录
  10. 北京沙龙报名 | 关于Dubbo开源的那些事儿