如何在Android Studio(Kotlin)中列出所有安卓应用/包?旧API方法已废弃
在Android Studio(Kotlin)中列出所有已安装应用的合规方案
核心替代方案(适配API 33+)
从Android 13(API 33)开始,旧的getInstalledApplications(int)方法被废弃,官方推荐使用带ApplicationInfoFlags参数的重载方法来获取已安装应用列表。
权限准备
- Android 10及以下:无需额外特殊权限,默认可获取大部分应用信息
- Android 11(API 30)及以上:
- 若需列出所有应用,需在
AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> - 若仅需访问特定类型应用(如浏览器、社交类),推荐用
<queries>标签声明访问范围,避免申请QUERY_ALL_PACKAGES,更符合Google Play审核要求。
- 若需列出所有应用,需在
Kotlin代码实现
val packageManager = packageManager // 构造适配新API的标志位,替代原有的GET_META_DATA val flags = PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong()) val installedApps = packageManager.getInstalledApplications(flags) for (appInfo in installedApps) { Log.d("APP_LIST", "已安装包名: ${appInfo.packageName}") Log.d("APP_LIST", "应用源目录: ${appInfo.sourceDir}") Log.d("APP_LIST", "启动Intent: ${packageManager.getLaunchIntentForPackage(appInfo.packageName)}") }
关于读取packages.xml的风险
直接读取/data/system/packages.xml是绝对不推荐且不合规的:
- 该路径属于系统私有目录,普通应用无读取权限,高版本Android中会直接抛出权限异常
- 违反Android安全规范,大概率导致应用在Google Play审核环节被拒绝
额外实用技巧
- 区分系统应用与第三方应用:
val isSystemApp = appInfo.flags and ApplicationInfo.FLAG_SYSTEM != 0 - 仅获取可启动的桌面应用:
val intent = Intent(Intent.ACTION_MAIN, null).apply { addCategory(Intent.CATEGORY_LAUNCHER) } val launchableApps = packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL)
内容的提问来源于stack exchange,提问作者Ervin Anoh
相关产品推荐
相关产品推荐

