Android 6.0运行时权限
一、简单介绍
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运行时权限的更多相关文章
- Android权限管理之Android 6.0运行时权限及解决办法
前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...
- Android 6.0+ 运行时权限
1.权限被分为了普通和危险两种 2.打电话的Demo import android.Manifest; import android.app.Activity; import android.cont ...
- Android数据存储之Android 6.0运行时权限下文件存储的思考
前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...
- Android 6.0 运行时权限处理完全解析
一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...
- 谈谈Android 6.0运行时权限理解
前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...
- android-详解Android 6.0运行时权限
感谢郭神,从Android 6.0开始,不再是安装应用时用户确定获得全部的权限.而是在使用软件过程中需要该权限时,弹出对话框让用户选择权限.不仅如此,用户选择权限后还可以关闭. 检查是否获得权限 通过 ...
- Android 6.0 运行时权限处理问题
序 自从升级到Android M以来,最大的改变就是增加了运行时权限RuntimePermission,6.0以上的系统如果没有做适配,运行了targetSDK=23的App时就会报权限错误.我们知道 ...
- Android 6.0运行时权限第三方库的使用-----RxPermissions
运行时权限的讲解在前一篇博客已经算是说的比较清楚了,这里就不说了,如果对6.0这个新特性不是很了解的朋友建议先看看(地址:http://blog.csdn.net/qq_33923079/articl ...
- Android 6.0 运行时权限处理完全解析 (摘抄)
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...
随机推荐
- Dodobox一个基于所有平台的嵌入式操作系统(OS)
DodoBox是为广大应用开始者提供的一个跨平台应用发布平台.它提供了客户端和服务器端的SDK及详细的开发者帮助文件,帮助开发者创建.移植软件应用或游戏应用. DodoBox基于OpenGL技术,提供 ...
- maven使用阿里代理下载
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http:/ ...
- 适用初学者:vue2.0构建单页应用最佳实战
参考:https://segmentfault.com/a/1190000007630677 自己gitHub项目地址:https://github.com/shixiaoyanyan/vue-wor ...
- 【SQL】- 基础知识梳理(三) - SQL连接查询
一.引言 有时为了得到一张报表的完整数据,需要从两个或更多的表中获取结果,这时就用到了"连接查询". 二.连接查询 连接查询的定义: 数据库中的表通过键将彼此联系起来,从而获取这些 ...
- Spring框架(一)
Spring: Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 Rod Johnson在其著作 Expert One-On-One J2EE Deve ...
- ArrayList底层实现原理
ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现列表接口外,此类还提供一些方法来操作内部用来存储列表的数组 ...
- Vue2.0 探索之路——生命周期和钩子函数
beforecreate :可以在这加个loading事件 created :在这结束loading,还做一些初始化,实现函数自执行 mounted : 在这发起后端请求,拿回数据,配合路由钩子做一些 ...
- Delphi中paramstr的用法
原型 function paramstr(i:index):string 对于任何application paramstr(0)都默认代表的是应用程序的 ...
- VCL组件之TLabel、TStaticText和TLabeledEdit
TLabel.TStaticText.TLabeledEdit类的继承关系如下:
- CDH入门
cloudera(CDH)官网介绍:安装包.离线包该如何下载.官方文档等介绍http://www.aboutyun.com/thread-8908-1-1.html(出处: about云开发) 进入C ...