Android---PKMS核心分析2
创始人
2025-05-31 02:21:53
0

目录

动态权限申请

权限分类

动态权限核心函数

requestPermissions 源码解析

安装的本质是:拷贝进去,然后扫描

当我们动态申请了 READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE其中的一个,可以不用动态申请另一个,因为它们都属于EXTERNAL_STORAGE组的权限,申请其中一个,就是把EXTERNAL_STORAGE这一组的权限都申请了。

动态申请权限后,用于点击了允许,下一次用户再进来就不再询问权限,是因为这个结果被 PKMS 保存到了 xml 文件中。当我们卸载应用时,保存了权限结果的xml 也卸载了,所有当我们再次安装时,又要再一次申请权限

动态权限申请

Google 在 Android 6.0 开始引入了权限申请机制,将所有权限分成了正常权限危险权限。App 每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。

权限分类

系统权限分为两类:正常权限危险权限。

正常权限:不会直接给用户隐私带来危险。如果你在其清单中列出了正常权限,系统将自动授予该权限。

危险权限:授予应用访问用户机密数据的权限。如果你在清单文件中列出了危险权限,则用户必须明确批准你的应用使用这些权限。那么危险权限有那些?日历(CALENDAR)相机(CAMERA) 通讯录(CONTACTS)位置(LOCATION)拨号(PHONE)短信(SMS)存储(STORAGE)等。




















申请以上权限时,除了要在清单文件中添加权限,还需要通过代码动态申请。

动态权限核心函数

1. 检测权限

checkSelfPermission(@NonNull String permission)

2. 申请权限

requestPermissions(@NonNull String[] permissions, int requestCode)

3. 处理结果回调

onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)

4. 是否需要显示 UI 界面提示用户为什么需要这个权限

shouldShowRequestPermissionRationale(@NonNull String permission)

上面核心函数的一个实例:动态权限申请

requestPermissions 源码解析

第一步:MainActivity 调用 requestPermissions 进行动态权限申请;

第二步:requestPermissions 函数通过隐士意图,激活 PackageInstaller 的 GrantPermissionsActivity 界面,让用户选择是否授权;

第三步:经过 PKMS 把相关信息传递给 PermissionManagerService 处理;

第四步:PermissionManagerService 处理结束后回调给 ---> PKMS 中的 onPermissionGranted 方法把处理结果返回;

第五步:PKMS 通知过程中权限变化,并调用 writeRuntimePermissionsForUserLPr 函数让 PackageManager 的 settings 记录下相关授权信息;

权限申请整体流程图:

 1. MainActivity 里调用 ActivityCompact.requestPermission()

2.  ActivityCompact.requestPermission()

3. Activity.requestPermissions() 

4. PackageManager.buildRequestPermissionsIntent() 

 buildRequestPermissionsIntent 函数的目的为了拼接一个 Intent, 那么就是搞隐士意图去激活某个 Activity

public static final String ACTION_REQUEST_PERMISSIONS =
"android.content.pm.action.REQUEST_PERMISSIONS";

5. 那么就根据 “Android.content.pm.action.REQUEST_PERMISSIONS” 表示动作来找到需要激活的某个 Activity 就 ok 了。

打开这里的 AndroidManifest.xml 找到我们需要的那个 Activity(就是 GrantPermissionsActivigty)

 

 6. 打开 GrantPermissionsActivity.java

 注意GrantPermissionsActivity 也就是我们场景的权限申请界面,如下图。用户可以根据提示选择是否授权给应用相应的权限。用户操作后的结果会通过回调 GrantPermissionsActivity 的 onPermissionGrantResult 方法返回。在 onPermissionGrantResult 方法中会根据返回结果去决定是走授予权限还是撤销权限流程,然后会更新授权结果,最后返回结果并结束自己:

7. onPermissionGrantResult 函数

8. 当我们点击“确定”,即授予权限时, 在 onPermissionGrantResult 会走AppPermissionGroup.grantRuntimePermissions(即上面代码 if 里的第一句),在该方法中会判断 targetSdkVersion 是否大于 LOLLIPOP_MR1(API22),如果大于则做动态权限申请处理

grantRuntimePermissions()

注意:XXXManager只是一个辅助类,真正提高服务的都是 XXXManagerService 

 9. 在 grantRuntimePermissions() 函数里通过 mPackageManager.grantRuntimePermission 跨进程到 PKMS

PermissionManagerInternal --- 接口实现---

PermissionManagerService.grantRuntimePermission

回到 PKMS 位置

调用流程:mSetting.writeRuntimePermissionForUserLPr ---> writePermissionsForUserSyncLPr ---->writePermissionsSync:

 

 

相关内容

热门资讯

python基础语法【模块 包... 模块 包 异常捕获 1.模块 python一个py文件就是一个模块 1.1 使用方法 1)前提&#x...
在recyclerview中使... 问题描述 最近在使用RecycerView的瀑布流布局,我想直接用ViewBindin...
java中Long型数据大小比... 起因 今天在做项目的时候,想构建一个树形结构,从数据库中查询出了所有数据...
智能控制 | AIRIOT智慧... 许多行业客户在智慧楼宇的建设中主要面临运营管理低效,楼宇内部各个系统相互独立ÿ...
Redis 数据结构 这里写目录标题Redis 数据结构一、String类型String数据类型的使用场景key 的设置约...
基于 MM32SPIN0280... M32SPIN0280 是灵动微电机新推出的针对电机控制市场的专用 MCU,该系列 M...
C++学习(指针、引用、结构体... 1编译软件Visual Studio2基本语法2.1指针2.1.1指针的使用//定义一个指针int ...
【UML】项目开发流程 以下模型是一个项目从启动到最终部署,逐步细化(精化)、实现...
docker-java应用部署 目录          1端口映射 2.Mysql部署 3.Tomcat部署 4.Nginx部署 5...
CentOS操作系统libc.... 使用xshell登陆Linux后查看jdk版本提示 /lib64/libc.so.6: versio...
Linux串口实现树莓派与电脑... 目录 一  串口说明 二  USB—TTL模块 ● usb-ttl模块接口  三  串口通信常用的A...
BeanPostProcess... 文章目录一、BeanPostProcessor的作用1. 源码2. 使用案例二、Spring生命周期...
2023.3.22 文章目录@13:static关键字**一:static修饰变量&...
模糊PID控制双容水箱液位控制... 资源:双容水箱液位模糊PID控制MATLAB仿真-电子商务文档类资源-CSDN文库模糊...
基于springboot家政服... 大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里...
提升代码质量,使用插件对 ja... 目录前言一、使用maven-checkstyle-plugin插件1. maven-checksty...
VSCode配置git bas... 打开左下角齿轮图标      打开Settings 搜索框输入 terminal.integrat...
Winform控件开发(21)... 一、属性 1、Name 用于获取控件对象 2、Anchor 锚定控件对于父控件的位置 3、BackC...
【kubernetes云原生】... 目录 一、标签选择器来源 二、什么是标签选择器 2.1 标签选择器概述 2.2 标签选择器概述属性 ...
重构条件-Replace Ne... 重构条件-Replace Nested Conditional with Guard Clauses...