一、简单介绍

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. Dodobox一个基于所有平台的嵌入式操作系统(OS)

    DodoBox是为广大应用开始者提供的一个跨平台应用发布平台.它提供了客户端和服务器端的SDK及详细的开发者帮助文件,帮助开发者创建.移植软件应用或游戏应用. DodoBox基于OpenGL技术,提供 ...

  2. maven使用阿里代理下载

    <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http:/ ...

  3. 适用初学者:vue2.0构建单页应用最佳实战

    参考:https://segmentfault.com/a/1190000007630677 自己gitHub项目地址:https://github.com/shixiaoyanyan/vue-wor ...

  4. 【SQL】- 基础知识梳理(三) - SQL连接查询

    一.引言 有时为了得到一张报表的完整数据,需要从两个或更多的表中获取结果,这时就用到了"连接查询". 二.连接查询 连接查询的定义: 数据库中的表通过键将彼此联系起来,从而获取这些 ...

  5. Spring框架(一)

    Spring: Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 Rod Johnson在其著作 Expert One-On-One J2EE Deve ...

  6. ArrayList底层实现原理

    ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现列表接口外,此类还提供一些方法来操作内部用来存储列表的数组 ...

  7. Vue2.0 探索之路——生命周期和钩子函数

    beforecreate :可以在这加个loading事件 created :在这结束loading,还做一些初始化,实现函数自执行 mounted : 在这发起后端请求,拿回数据,配合路由钩子做一些 ...

  8. Delphi中paramstr的用法

    原型                function   paramstr(i:index):string        对于任何application paramstr(0)都默认代表的是应用程序的 ...

  9. VCL组件之TLabel、TStaticText和TLabeledEdit

    TLabel.TStaticText.TLabeledEdit类的继承关系如下:

  10. CDH入门

    cloudera(CDH)官网介绍:安装包.离线包该如何下载.官方文档等介绍http://www.aboutyun.com/thread-8908-1-1.html(出处: about云开发) 进入C ...