Android 14 没有申请QUERY_ALL_PACKAGES权限,为何依旧弹出读取您的应用列表权限申请弹框?

先说当前遇到的问题

近期我们很多甲方反馈在适配Android 14 的过程中,某些14机型在应用启动时弹出读取您的应用列表权限申请弹框?但我们明明是没有申请QUERY_ALL_PACKAGES权限的,怎么回事呢?

但对于小贷或者其他金融应用,Applist数据对于风控来说是至为重要的,难道Google对于这部分数据要求这么严格了?对于无QUERY_ALL_PACKAGES权限获取Applist数据的文章及Applist数据重要性的分析,大家可以先打卡下这篇文章:

QUERY_ALL_PACKAGES权限不给了!!!我们如何获取用户应用安装列表?

问题定位

作为一个程序猿,遇事儿不要慌,Google or 百度 == result。 在经历了很长时间搜索以后,没有发现什么结果。还是先人说的对,纸上得来终觉浅,绝知此事要躬行。既然我们没有申请权限,那必然是代码被检测出问题了。项目在启动时初始化了很多的三方库和自研库,项目中肯定是某些代码触发了Google安全机制,导致了此问题。那个就一个库一个库的在项目中移除,以此来定位具体原因。

最终发现,有两个底层库会触发应用列表权限申请弹框。而这两个库都调用了getInstalledPackages方法来获取某些app信息。

分析弹权限弹窗可能原因是:在Android 14手机版本中,对于未在应用中声明

### 在安卓15中动态申请 `QUERY_ALL_PACKAGES` 权限的方法 在安卓15中,动态申请 `QUERY_ALL_PACKAGES` 权限需要遵循特定的流程。由于此权限属于特殊权限类别,其申请方式不同于普通权限或危险权限[^2]。以下是实现方法: #### 1. 静态声明权限 首先,在应用的 `AndroidManifest.xml` 文件中静态声明该权限: ```xml <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> ``` 此步骤确保系统能够识别应用需要访问此权限。 #### 2. 检查权限状态 运行时需要检查应用是否已经拥有该权限。可以使用 `ContextCompat.checkSelfPermission()` 方法来完成这一操作: ```java if (ContextCompat.checkSelfPermission(context, Manifest.permission.QUERY_ALL_PACKAGES) != PackageManager.PERMISSION_GRANTED) { // 权限未授予 } ``` 上述代码用于判断当前应用是否已被授予 `QUERY_ALL_PACKAGES` 权限[^4]。 #### 3. 引导用户手动授予权限 由于 `QUERY_ALL_PACKAGES` 权限无法通过标准的窗提示直接请求,必须引导用户前往系统设置页面手动开启。可以通过以下代码启动权限设置界面: ```java Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); Uri uri = Uri.fromParts("package", context.getPackageName(), null); intent.setData(uri); startActivity(intent); ``` 这段代码将用户导向到应用权限管理页面,允许用户手动启用 `QUERY_ALL_PACKAGES` 权限[^2]。 #### 4. 检测权限变更 当用户从设置页面返回后,需重新检查权限状态以确认是否已授予。可结合 `onResume()` 或其他生命周期方法进行检测: ```java @Override protected void onResume() { super.onResume(); if (ContextCompat.checkSelfPermission(this, Manifest.permission.QUERY_ALL_PACKAGES) == PackageManager.PERMISSION_GRANTED) { // 权限已授予,执行相关逻辑 } else { // 权限仍未授予,提示用户再次授权 } } ``` #### 注意事项 - `QUERY_ALL_PACKAGES` 权限仅适用于需要访问所有安装包信息的应用场景,如杀毒软件或设备管理工具。如果滥用此权限,可能会导致应用被拒绝上架。 - 从用户体验角度出发,建议明确告知用户为何需要此权限,并提供简洁的操作指引[^5]。 ### 示例代码总结 以下为完整的动态申请 `QUERY_ALL_PACKAGES` 权限的代码示例: ```java public void requestQueryAllPackagesPermission(Context context) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.QUERY_ALL_PACKAGES) != PackageManager.PERMISSION_GRANTED) { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); Uri uri = Uri.fromParts("package", context.getPackageName(), null); intent.setData(uri); if (intent.resolveActivity(context.getPackageManager()) != null) { context.startActivity(intent); } } else { // 权限已授予,执行相关逻辑 } } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值