You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:52:20