Android权限管理知识学习记录
一、Android权限背景知识
在Android 6.0之前,所申请的权限只需要在AndroidManifest.xml列举就可以了,从而容易导致一些安全隐患,因此,在Android 6.0时,Google为了更好的保护用户隐私提出了新的权限管理机制,同时将其分为两大类:
(1)Normal Permissions
Normal Permission一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动,访问网络等。
(2)Dangerous Permission
Dangerous Permission一般是涉及到用户隐私的,需要用户进行授权(动态申请),比如读取SIM卡状态、访问通讯录、SD卡读写等。
通过adb shell pm list permission -d -g可以查看Dangerous Permission。
Dangerous Permission一般以Permission group形式存在,只要Permission Group中某一个permission被Granted(授予),则整个Permission group下的权限均被Granted。
二、权限检查及权限兼容
1.targetSdkVersion>=23,终端设备是6.0(api 23)以上系统。
安装的时候不会获得权限,在运行时向用户申请对应权限。这部分权限检查比较简单,不涉及权限兼容,使用官方方案就可以,使用Context:checkSelfPermission,建议使用ContextCompat:checkSelfPermission检查权限即可,一般检查流程如下:
(1)判断是否有对应权限
(ContextCompat::checkSelfPermision)
(2)判断是否需要解释对应权限用途(ActivityCompat::shouldShowRequestPermissionRationale)
如果需要解释,则显示自定义权限界面即可
(3)不需要解释的话,直接请求对应权限
(ActivityCompat::requestPermission)
2.targetSdkVersion<23.终端设备是6.0(api 23)以上系统
使用的是老的权限机制,在app安装时会询问AndroidManifest.xml文件中的权限,但是用户可以在设置列表中关闭相关权限,这种情况可能会对app正常运行造成一定影响。
3.终端设备系统小于6.0(api 23)
老的权限管理机制是,在app安装时会询问AndroidManifest.xml文件中的权限,用户关闭不了,但是目前有不少国产Rom手机在6.0之间就有关闭权限的开关。
适配过程:
1.使用try-catch来检查权限是否关闭
使用READ_PHONE_STATE权限的方法内部已经try-catch,外面无法捕获,所以如果该权限被用户禁止了,报异常时,在catch中做文章的方法根本没有用。
2.ContextCompat::checkSelfPermission
在6.0可以使用Context::checkSelfPermission进行权限检查,在api 23那使用support v4中的ContextCompat::checkSelfPermission方法失效,只要权限在AndroidManifest.xml中注册过,均会认为该权限granted,因此方法在api 23以下失效。
3.PermissionChecker
PermissionChecker内部实际上使用的是AppOpsManagerCompat,而AppOpsManager是在api 19加入进去的。
在api 23以下,AppOpsManagerImpl::permissionToOp直接返回为null,这直接导致api 23以下权限检查将会返回granted,因此,该方法在api 23下,权限检查方法也会失效。
4.AppOpsManager
API 19以上,Google官方提供了AppOpsManager类来检查权限,里面有两个比较重要的方法: AppOpsManager::checkOp(int op,int uid,String packageName)(hide方法,需要反射)和AppOpsManager::checkOp(String op,int uid,String packageName)(public方法,api 23以上可用)。
但是,当api低于23时,OP_READ_PHONE_STATE=51找不到,导致AppOpsManager::checkOp方法反射失败,导致的原因是每个版本的_NUM_OP不同,OP_READ_PHONE_STATE = 51在6.0(API 23)以下,通过反射是找不到的,因此对于READ_PHONE_STATE权限检查仅限于6.0及6.0以上。
三、跳转到app管理权限界面
1.直接跳转系统设置页
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package",getPackageName(), null)); try {
startActivity(intent);
}catch (Exception e){
e.printStackTrace();
}
记得要添加try-catch,不加可能会crash(崩溃)。这种方式就不需要适配各个厂商的不同版本rom,缺点是,用户只能跳转到系统设置页,然后去找对应app的权限管理。
2.站在前人的肩
对于不同的手机或手机系统,跳转权限管理页面的activity或者有所不同,如果没有加上try-catch,就会直接crash。
对于这种变化,作为开发者一般都是不知道的,即便通过反馈发现了这个问题,也有可能不知道actiivty是什么,此刻要么搜索网上有没有类似解决方案,要么求助于对应rom开发厂商的开发者论坛。
3.查看某个rom的某个版本的权限管理界面的activity
(1)通过设置找到对应app的权限管理页面
(2)找到对应页面的activity
方法一:通过add工具查看栈顶Activity
adb shell dumpsys activity | grep "mFocusedActivity"
方法二:使用Activity Tracer工具
本文只是将看到的文章进行了学习整理记录,详细的还请查看原文。
原文:http://mp.weixin.qq.com/s/OQRHEufCUXBA3d3DMZXMKQ
Android权限管理知识学习记录的更多相关文章
- Android 开发者必知必会的权限管理知识
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/OQRHEufCUXBA3d3DMZXMKQ 导语 本 ...
- Android权限管理之RxPermission解决Android 6.0 适配问题
前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...
- Android权限管理之Android 6.0运行时权限及解决办法
前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...
- Android权限管理之Permission权限机制及使用
前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...
- android: Android 权限管理小结
一. 概述 感谢郭神,自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有 ...
- Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用
PermissionsDispatcher2.3.2使用 Android6.0权限官网https://developer.android.com/about/versions/marshmallow/ ...
- android 权限管理和签名 实现静默卸载
为了实现静默卸载, 学了下android的安全体系,记录如下 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份. 安装在设备中的每一个apk文件,Android ...
- 2018/09/05《涂抹MySQL》【权限管理】学习笔记(二)
读 第四章<管理MySQL库与表> 第五章<MySQL的权限管理> 总结 1:当配置好 MySQL 数据库后,发现有几个默认的库,他们的意义和作用?(这里只做简单了解,之后用到 ...
- Android 权限管理(持续整理)
1. Android 6.0之后,APP可以直接安装,运行时再询问用户授予相关权限,此时系统弹出一个对话框,(这个对话框不能由开发者定制) 同时用户也可以在手机的“设置”中对于某个App进行权限管理 ...
随机推荐
- 在Visual Studio 中开发Office Add-in
作者:陈希章 发表于2017年7月13日 "Talk is cheap, show me the code",我们就用代码来说话吧.这一篇将给大家介绍如何开始Office Add- ...
- 我在Windows下的第一个Shellcode
纪念我的第一个Shellcode(XP SP3, VC6): 1.获取MessageBoxA(ASCII)的静态地址 2.编写汇编代码调试,获取对应的机器码(注意字符串由栈顶向栈底生长,push由栈底 ...
- 【python】字符串格式化
- bzoj 1758: [Wc2010]重建计划
Description Input 第 一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案 ...
- Struts2-整理笔记(五)拦截器、拦截器配置
拦截器(Interceptor) 拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制. 拦截器的优点 简化了Action的实现 ...
- MySQL集群PXC的搭建
MySQL集群PXC的搭建 最近公司某客户要求我们的数据库搭建PXC集群以保证他们的系统高性能和搞稳定性 以后花费了一些时间去搭建和测试,也踩过一些坑,准备分享出来 系统:centos6.6PXC:5 ...
- 常用API接口汇总
下面列举了100多个国内常用API接口,并按照 笔记.出行.词典.电商.地图.电影.即时通讯.开发者网站.快递查询.旅游.社交.视频.天气.团队协作.图片与图像处理.外卖.消息推送.音乐.云.语义识别 ...
- 微信小程序语音识别开发过程记录 微信小程序silk转mp3 silk转wav 以及ffmpeg使用
说说最近在开发微信小程序语音识别遇到的问题吧 最先使用微信小程序录音控件可以拿到silk格式,后来微信官方又支持mp3格式了 但是我们拿到这些格式以后,都还不能直接使用,做语音识别,因为目前百度的语音 ...
- 如何高逼格读取Web.config中的AppSettings
http://edi.wang/post/2015/4/22/how-to-read-webconfig-appsettings-with-bigiblity 先插句题外话,下版本的ASP.NET貌似 ...
- Python学习_07_错误、异常
地毯式地过语法终于快要结束了... Python中的常见异常 1.NameError:尝试访问一个未初始化的变量 2. ZeroDivisionError:除数为0 3. SyntaxError:Py ...