Android---PKMS核心分析2
创始人
2025-05-31 01:12:35
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:

 

 

相关内容

热门资讯

走进小城看消费丨江西资溪:低碳...   夏日时节下午4点,江西省抚州市资溪县大觉山景区漂流终点依然热闹。来自南昌的游客余鑫漂流结束后没有...
【中原晨会0625】市场分析专... 来源:市场资讯 (来源:中原证券研究所) 本期重点研报目录 【中原策略】市场分析:电子半导体领涨 ...
南向资金连买4日!低费率+可月... 6月25日早盘,港股红利资产震荡整理。截至11时14分,港股红利低波ETF招商(520550)下跌0...
618成交破百万!紫荆花用一套... 一年一度的618年中大促,是消费市场的晴雨表,也是品牌间最激烈的角力场。当各大品牌在直播间里铆足了劲...
原创 黄... 2026年6月25日的国际金价已经从前期的5500美元高点跌到4200美元下方,累计跌幅超过22%,...
英伟达CEO:Vera Rub... 截至9:38,中证半导体材料设备主题指数(931743)涨2.36%创新高;权重股中,中微公司涨3....
再被催债16亿!“钢铁大王”戴... 澎湃新闻记者 贺梨萍 因“铁本事件”入狱五年的戴国芳重返钢铁行业,但他并没有完成从阶下囚再到“钢铁大...
周三原油价格下跌 随着美国和伊朗在和平谈判中取得进展,越来越多的油轮公开穿越霍尔木兹海峡,原油在战时的价格上涨已经蒸发...
这种蛋白是大脑衰老的开关 这种蛋白是大脑衰老的开关 清晨,假设一位五十岁左右的王女士发现自己常常把手机放在熟悉的抽屉里又找不到...
信通院牵头算力Token出海生... 盘面上,截至11:04,中证科创创业50指数(931643)涨1.68%,创历史新高;权重股中,芯原...
海外 774 亿营收背后:日本... 文 | 游戏价值论 6月23日,彭博社报道了腾讯正在围绕出售多家日本游戏工作室少数股权开展谈判,包...
餐饮“抢人”大战:把店开到公交... 作者 |餐饮老板内参 内参君 医院、公交站、演唱会…餐饮品牌,正在无孔不入 在北京儿童医院,肯德基...
快讯 | 外资扫货!陈翊庭:港... 港交所行政总裁陈翊庭在接受《中国证券报》专访时指出,国际资本对中国资产的看法已彻底扭转,布局中国市场...
2777.77元!A股“股王”... 25日早盘,昨天创下历史新高的A股“股王”联讯仪器,今天上午继续走强,盘中股价再度刷新历史新高。 截...
原创 今... 欧洲自己的媒体直接下结论,欧盟衰退躲不掉,内部分裂拦不住,现在就连欧洲顶尖工业巨头,都偷偷在用中国的...
黄仁勋股东大会放言:本轮AI基... 在当地时间6月24日的英伟达(NVDA.O)2026年度股东大会上,股东批准了该公司全部10名董事会...
国际油价大跌 新华社消息, 纽约原油期货主力合约价格24日盘中跌破每桶70美元,为伊朗战事爆发以来首次。 市场分析...
马云带队插秧,什么信号? 一场别开生面的“务农”,让外界看到了一个不一样的阿里巴巴。 近日,阿里巴巴合伙人、高德董事长刘振飞在...
全球最大产能,最高丰度达99.... 本文转自【科技日报】; 6月23日,高丰度硼-10同位素技术暨产业化成果发布会在山东省东营市举办,全...
黄金大跳水!金饰克价年内暴跌近... 25日,现货黄金盘中震荡,截至发稿,报3985.070美元/盎司,跌0.17%。 当地时间24日,...