一、简单介绍

Android 6.0在手机安全方面做的一个处理就是增加了运行时权限(Runtime Permissions)。

新的权限机制更好的保护了用户的隐私,Google将权限分为两类,正常权限(Normal Permissions)和危险权限(Dangerous Permissions)。这些概念都比较好理解,Normal Permissions 主要就是一些不涉及用户隐私的权限,比如wifi,网络,这些权限和6.0之前的权限添加方式一样,只需要在AndroidManifest.xml中添加就可以。

Dangerous Permissions又称运行时权限,这个需要在Java代码中添加是否处理的代码。

二、处理方式

1、代码中判断权限是否存在:

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}

判断主要是:

public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
if (permission == null) {
throw new IllegalArgumentException("permission is null");
} return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());
}

如果有多个权限,需要使用循环来判断,就需要封装一些判断的方法,这个方法的返回值是:

  • PackageManager.PERMISSION_GRANTED 有权限
  • PackageManager.PERMISSION_DENIED 没权限

没权限的就需要调用requestPermissions申请权限,申请时会有一个弹窗出来,点击确定或取消后,会回调下面的方法:

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

在这里面就可以处理点击确定或取消的结果。

三、封装

1、自定义需要的权限数组

public static final String[] REQUIRED_PERMISSIONS = new String[]{
permission.READ_EXTERNAL_STORAGE,
permission.WRITE_EXTERNAL_STORAGE};

2、判读是否需要权限的方法

    /**
* M = 6.0 = 23
* N = 7.0 = 24
* O = 8.0 = 26
*
* @return
*/
public static boolean isRequiredPermissions() {
return Build.VERSION.SDK_INT >= 23;
} public static boolean hasPermissions(Context context, String permission) {
if (!isRequiredPermissions()) {
return true;
}
if (ContextCompat.checkSelfPermission(context, permission)
!= PackageManager.PERMISSION_GRANTED) {
return false;
}
return true;
} public static boolean hasPermissions(Context context, String[] permissions) {
if (!isRequiredPermissions()) {
return true;
}
try {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(context, permission)
!= PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
} finally {
}
}

3、请求权限

    private void requestPermissions(Activity context) {
final ArrayList<String> unsatisfiedPermissions = new ArrayList<>();
for (String permission : Utils.REQUIRED_PERMISSIONS) {
if (Utils.hasPermissions(context, permission)) {
unsatisfiedPermissions.add(permission);
}
}
ActivityCompat.requestPermissions(context, unsatisfiedPermissions.toArray(new String[unsatisfiedPermissions.size()]),
REQUEST_CODE);
}

4、结果判断处理

    public static boolean isAllGranted(String permissions[], int[] grantResult) {
for (int i = 0; i < permissions.length; i++) {
if (grantResult[i] != PackageManager.PERMISSION_GRANTED
&& isPermissionRequired(permissions[i])) {
return false;
}
}
return true;
} public static boolean isPermissionRequired(String p) {
return Arrays.asList(REQUIRED_PERMISSIONS).contains(p);
}

注意:

当我们的minSdkVersion小于23的时候,在Activity中是不能直接使用requestPermissions方法和checkSelfPermission方法的,

而是使用ActivityCompat.requestPermissions和ContextCompat.checkSelfPermission。

上述的封装只是个人经验总结,提供一个大概的思路,欢迎提意见,感谢!

Android 6.0运行时权限的更多相关文章

  1. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  2. Android 6.0+ 运行时权限

    1.权限被分为了普通和危险两种 2.打电话的Demo import android.Manifest; import android.app.Activity; import android.cont ...

  3. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  4. Android 6.0 运行时权限处理完全解析

    一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...

  5. 谈谈Android 6.0运行时权限理解

    前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...

  6. android-详解Android 6.0运行时权限

    感谢郭神,从Android 6.0开始,不再是安装应用时用户确定获得全部的权限.而是在使用软件过程中需要该权限时,弹出对话框让用户选择权限.不仅如此,用户选择权限后还可以关闭. 检查是否获得权限 通过 ...

  7. Android 6.0 运行时权限处理问题

    序 自从升级到Android M以来,最大的改变就是增加了运行时权限RuntimePermission,6.0以上的系统如果没有做适配,运行了targetSDK=23的App时就会报权限错误.我们知道 ...

  8. Android 6.0运行时权限第三方库的使用-----RxPermissions

    运行时权限的讲解在前一篇博客已经算是说的比较清楚了,这里就不说了,如果对6.0这个新特性不是很了解的朋友建议先看看(地址:http://blog.csdn.net/qq_33923079/articl ...

  9. Android 6.0 运行时权限处理完全解析 (摘抄)

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...

随机推荐

  1. bzoj 3212 Pku3468 A Simple Problem with Integers

    3212: Pku3468 A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 128 MB Description You ...

  2. ubuntu下pip的安装和使用

    对于python包的安装而言,需要pip包,对python包资源管理.pip包的安装.对于python2.x和python 3.x 方法不同 : Python 2: sudo dnf upgrade ...

  3. Tomcat启动一闪而过

    问题: 在下载tomcat7纯净版之后,配置完环境变量.运行startup.bat,一闪而过tomcat没有启动成功. 解决办法: 设置CLASSPATH.环境变量设置JAVA_HOME为java安装 ...

  4. JAVA 并发(待补全!)

    从性能上看 如果没有任务会阻塞 那么在单处理器的机器人使用并发就没有任何意义 (需要上下文切换 时间反而长) 进程是运行在他自己地址空间的自包容的程序 协作多线程与抢占式多线程 想要定义任务需要实现R ...

  5. 风趣的JavaScript面向对象入门课程一

    在我们程序猿界一直流传这这么一个joke,没女票我们可以new一个.没房子没票子没车子我们同样new一个!当然这听着更像是一种自嘲,毕竟我们程序猿都爱自嘲,哈哈,废话不多说,今天就由我带着你们来入Ja ...

  6. P1035

    P1035 时间限制: 1 Sec  内存限制: 128 MB提交: 87  解决: 36[提交][状态][讨论版] 题目描述 给出一张n*n(n< =100)的国际象棋棋盘,其中被删除了一些点 ...

  7. 宿命的PSS

    宿命的PSS 时间限制: 1 Sec  内存限制: 128 MB提交: 60  解决: 37[提交][状态][讨论版] 题目描述 最小生成树P.S.S在宿命的指引下找到了巫师Kismi.P.S.S希望 ...

  8. margin:0px auto和text-align:center区别

    (1)margin:0px auto :作用于块级元素,对块级元素进行居中 (2)text-align:center:作用于内联元素,必须放在要居中的内联元素所在的块级元素. 例: (1) <d ...

  9. 认识jQuery的Promise

    先前了解了ES6的Promise对象,来看看jQuery中的Promise,也就是jQuery的Deferred对象. 打开浏览器的控制台先. <script> var defer = $ ...

  10. M-定在下边的区域

    1 效果 2 布局 3 样式