一、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权限管理知识学习记录的更多相关文章

  1. Android 开发者必知必会的权限管理知识

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/OQRHEufCUXBA3d3DMZXMKQ 导语 本 ...

  2. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

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

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

  4. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  5. android: Android 权限管理小结

    一. 概述 感谢郭神,自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有 ...

  6. Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用

    PermissionsDispatcher2.3.2使用 Android6.0权限官网https://developer.android.com/about/versions/marshmallow/ ...

  7. android 权限管理和签名 实现静默卸载

    为了实现静默卸载, 学了下android的安全体系,记录如下 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份. 安装在设备中的每一个apk文件,Android ...

  8. 2018/09/05《涂抹MySQL》【权限管理】学习笔记(二)

    读 第四章<管理MySQL库与表> 第五章<MySQL的权限管理> 总结 1:当配置好 MySQL 数据库后,发现有几个默认的库,他们的意义和作用?(这里只做简单了解,之后用到 ...

  9. Android 权限管理(持续整理)

    1. Android 6.0之后,APP可以直接安装,运行时再询问用户授予相关权限,此时系统弹出一个对话框,(这个对话框不能由开发者定制) 同时用户也可以在手机的“设置”中对于某个App进行权限管理 ...

随机推荐

  1. java语言实现树

    首先用Node类定义一个节点,用来存储每个节点的内容: public class Node { // 关键字 private int keyData; // 其他数据 private int othe ...

  2. time模块整理

    time模块中包含的方法 time() -- 返回当前系统的时间戳clock() -- 在UNIX系统上,它返回的是"进程时间",它是用秒表示的浮点数(时间戳). 而在WINDOW ...

  3. Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/ServletRegistrationBean

    异常信息 2017-09-02 18:06:37.223 [main] ERROR o.s.boot.SpringApplication - Application startup failed ja ...

  4. .NET 实现DES加密解密处理

    .NET 实现DES加密解密处理 using System; using System.Text; using System.Security.Cryptography; using System.I ...

  5. 《修改代码的艺术》【PDF】下载

    <修改代码的艺术>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382309 内容简介 <修改代码的艺术>针对大型的. ...

  6. CentOS ifconfig无IP地址解决办法

    修改/etc/sysconfig/network-scripts/ifcfg-ens33 把 ONBOOT 改为 yes,重启后就会有ip,且物理机和虚拟机可以互相ping通了.

  7. sudo 做不到的事

    本文是经验帖,以后遇到类似的情况会持续更新到这篇文章 普通用户使用sudo会遇到以下情况 1.字符流无法写入到 /var/log/messages /var/log/secure (实际上这些文件一旦 ...

  8. precmd:6: job table full or recursion limit exceeded

    使用GDC Data Transfer Tool下载10999个isoforms.quantification.txt文件时,写了shell循环的小脚本: cat all_id_file |while ...

  9. springBoot系列教程07:异常捕获

    发生异常是很正常的事,异常种类也是千奇百怪,发生异常并不可怕,只要正确的处理,并正确的返回错误信息并无大碍,如果不进行捕获或者处理,分分钟服务器宕机是很正常的事 所以处理异常时,最基本的要求就是发生异 ...

  10. 笔记-CGRectInset CGRectoffset UIEdgeInsetsInsetRect 这三个函数的使用情况

    //CGRectInset 将原来的矩形放大或者缩小,正表示缩小,-表示放大. CGRect rect= CGRectMake(20, 50, 100, 80); CGRect rect1=CGRec ...