当前位置:   article > 正文

Android: 动态运行时权限(危险权限)源码分析、封装、及9.0权限改动_activitycompat.requestpermissions

activitycompat.requestpermissions

简介:

动态运行时权限的检测流程分析:(Android 6.0开始就有了危险权限)

  • ActivityCompat.requestPermissions()
  • ActivityCompat.shouldShowRequestPermissionRationale()
  • ActivityCompat.checkSelfPermission(value)

Android 9.0 对于权限处理和6.0的有较大区别。

在6.0中,申请了权限组中当中的某个组的子权限,比如申请写入外部存储空间的权限,系统同时会授予读外部存储空间的权限。

Android 9.0:如果只申请了权限组中的某个子权限,就只会授予该权限的使用,该权限组的其他子权限在使用的时候需要额外的去申请。

运行时权限涉及安全校验。【开发中很少涉及】

关于哪些是危险权限,实际请以Android Developer 官网资料为准。

Android 权限 = 普通权限 + 危险权限

权限组 子权限
SMS 短信 SEND_SMS      RECEIVE_SMS    READ_SMS   RECEIVE_WAP_PUSH
STORAGE 存储卡 READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE
CONTACTS 联系人

READ_CONTACTS  WRITE_CONTACTS  GET_ACCOUNTS

PHONE 手机 READ_PHONE_STATE  CALL_PHONE  READ_CALL_LOG  WRITE_CALL_LOG
CALENDAR日历 READ_CALENDAR  WRITE_CALENDAR
CAMERA 相机 CAMERA
LOCATION 位置 ACCESS_FINE_LOCATION  ACCESS_COASE_LOCATION
BODY_SENSORS BODY_SENSORS
MICROPHONE 麦克风 RECORD_AUDIO

相关概念:

1. uid 与 pid:

uid:本身是linux权限系统中用以区分用户身份的标识。android是单一用户权限系统,uid在android里可以理解为应用的标识Id,该Id自安装之日起就被分配,始终不变,除非重新安装。

pid:进程唯一标识id,用以和远程服务交互。

2. appId与callerId:

appId: 可理解为应用Id,和uid一样。是本地应用在远程服务中的叫法。

callerId: 是服务请求者的身份Id,可以是本地应用的身份id,可以是远程服务的身份标识id。


查看android.jar中隐藏的API: [关于hidden api 的官方措施,可查看bilibili上的Goolge账号进行查看视频]

Android Hidden API是经过修改的jar文件,它将android.jarAndroid SDK中的和framework.jar真实设备中的结合在一起。这个jar可以在开发中使用Android的内部/隐藏API。

什么是Android内部和隐藏API? 内部API位于com.android.internal包中,可framework.jar从真实的Android设备在文件中找到,而隐藏的API位于android.jar具有@hide javadoc属性的文件中。尽管类和方法是public您无法直接访问的。您可以从此软件包中使用许多的方法和资源。假定这是一个API,并将其称为隐藏API。

有什么好处? 当您想在项目中使用类似的函数时,无需创建新的类,常量,方法或资源。例如,如果您要创建一个String包含“接受”一词的新资源。然后,您想为另一种语言(例如阿拉伯语,印度尼西亚语)创建新的翻译,即使世界上所有语言也是如此。这太累了,浪费时间。您为什么不使用com.android.internal.R.string.accept通过检索的内容InternalAccessor.getString("accept")

  • Github上已有前辈去除了android.jar中的@hide注解:https://github.com/anggrayudi/android-hidden-api
  • 下载对应API版本Android.jar
  • 替换SDK/platforms/android-版本/Android.jar
  • 新建工程并更改targetVerison 、 compileVersion =  28 
  • 重新打开AS查看。

(以28为示例)

替换后新建一个项目改动如下


源码分析:

1. checkSelfPermission:

 

跳到了context里面,这里是抽象方法,众所周知,context类的实现类是ContextImpl,所以跳转到该类去查看本方法的实现。【关于context的理解可以看源码】

直接拿到了ActivityManager的实例【AMS家族~可能说法不准确,好像

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号