Android API 33如何获取所有已安装应用?旧方法已弃用
Android 13(API 33)获取全部已安装应用的等效替代方案
在Android 13中,要替代API 33之前通过packageManager.queryIntentActivities(i, 0)加QUERY_ALL_PACKAGES权限获取全部应用的逻辑,可按以下两种场景处理:
1. 需获取所有已安装应用(仅合规场景使用)
如果你的应用属于应用管理器、安全类工具等确实需要访问全部应用的场景,可继续保留权限声明,同时使用新的API重载:
- 在Manifest中保留权限:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
- 使用带
MATCH_ALL标志的新方法:
val intent = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER) val resolveFlags = PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_ALL.toLong()) val allActivities = packageManager.queryIntentActivities(intent, resolveFlags)
注意:Google对QUERY_ALL_PACKAGES权限的审核极为严格,非必要场景不建议使用。
2. 定向查询(推荐)
如果你的应用不需要获取全部应用,应采用定向查询避免申请敏感权限:
- 针对能处理特定Intent的应用:构造对应Intent,搭配
MATCH_DEFAULT_ONLY标志查询 - 针对已知包名的应用:直接调用
getPackageInfo获取目标应用信息
核心差异说明
API 33弃用旧的queryIntentActivities重载后,标志位需通过ResolveInfoFlags.of()封装,MATCH_ALL标志可实现旧方法中0参数的等效效果——返回所有匹配的应用(需配合QUERY_ALL_PACKAGES权限)。
内容的提问来源于stack exchange,提问作者just_user
相关产品推荐
相关产品推荐

