Android 高版本(Android 9.0) packageManager.getPackageArchiveInfo 总是返回null

本文介绍了在Android 9.0及更高版本中,使用packageManager.getPackageArchiveInfo方法返回null的问题解决方案。由于Android系统的隐私保护增强,直接访问共享/外部存储设备的方法已被废弃。文章提供了正确的path写法,即使用context.getExternalFilesDir替换Environment.getExternalStorageDirectory,以确保在新系统中获取到正确的包信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近自己写插件时,总是发现packageManager.getPackageArchiveInfo 返回为null,但是自己权限都打开,加载路径也是正确的,到底是为什么呢?

packageInfo =packageManager.getPackageArchiveInfo(path,
                    PackageManager.GET_ACTIVITIES );

原来path写法有问题,之前的写法:

Environment.getExternalStorageDirectory()+"/Download/lh.apk"

可是上面的写法在Android9.0 之后就废弃了(为了提高用户隐私,不建议直接访问共享/外部存储设备),并且不再返回可访问的文件。

那怎么写了,官方推荐使用:

context.getExternalFilesDir(String type)

修改之后,返回就正确了。

### Android 中 `PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS` 的用法与含义 在 Android 开发中,`PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS` 是一个标志位,用于过滤查询到的组件列表。此标志表示仅返回那些状态为 **DISABLED_UNTIL_USED** 的组件。 #### 含义 当应用程序中的某些组件(如活动、服务或广播接收器)被标记为禁用直到使用时,这些组件的状态会被设置为 **DISABLED_UNTIL_USED**。这意味着它们当前处于禁用状态,但在特定条件下可以通过用户的交互或其他触发条件重新启用。通过传递 `MATCH_DISABLED_UNTIL_USED_COMPONENTS` 标志给 `PackageManager.queryIntentActivities()` 或其他相关方法,开发者可以获得这些特殊状态下组件的相关信息[^3]。 #### 使用场景 该标志通常与其他标志组合使用,以便更精确地控制哪些类型的组件应该包含在查询结果中。例如,在构建应用启动器或者需要动态调整可用功能的应用程序中,可能需要用到这个标志来获取完整的组件视图,包括暂时不可见但可激活的组件。 以下是结合多个标志的一个简单例子: ```java // 查询所有匹配指定 Intent 的 Activity 并包含 DISABLED_UNTIL_USED 状态的组件 List<ResolveInfo> resolveInfos = getPackageManager() .queryIntentActivities(intent, PackageManager.MATCH_ALL | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS); ``` 上述代码片段展示了如何利用 `MATCH_DISABLED_UNTIL_USED_COMPONENTS` 来扩展默认行为,从而检索更多关于目标设备上安装的应用及其内部结构的数据[^4]。 #### 注意事项 需要注意的是,随着版本迭代,Android 对权限管理和隐私保护越来越严格,因此即使能够查找到此类组件,也可能受限于运行环境的安全策略而无法实际操作它们。此外,不当访问可能会引发安全警告甚至崩溃风险,所以在设计实现方案前务必充分测试验证其兼容性和稳定性。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值