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

Android如何获取设备上所有用户安装应用?现有代码仅能获取部分

问题原因

你的代码通过Intent.ACTION_MAIN + Intent.CATEGORY_LAUNCHER查询应用,这种方式仅能获取包含可启动Activity(桌面有图标)的应用,那些没有公开启动入口、或被系统配置隐藏的应用会被过滤掉,这就是你无法获取到Facebook、Messenger等应用的核心原因。

解决方案:获取所有已安装应用

要获取设备上所有已安装的应用(包括系统应用、无启动图标的应用),可以直接使用PackageManager的getInstalledApplications()或getInstalledPackages()方法,以下是具体实现:

方法1:使用getInstalledApplications()

private fun getAllInstalledApps(context: Context): ArrayList<AppInstall> {
    val appList = ArrayList<AppInstall>()
    // 获取所有已安装应用的ApplicationInfo
    val installedApps = context.packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
    
    for (appInfo in installedApps) {
        // 过滤系统应用(可选,若需要包含系统应用可移除该判断)
        if ((appInfo.flags and ApplicationInfo.FLAG_SYSTEM) == 0) {
            val appName = appInfo.loadLabel(context.packageManager).toString()
            val appIcon = appInfo.loadIcon(context.packageManager)
            val bitmap = drawableToBitmap(appIcon)
            val packageName = appInfo.packageName
            
            appList.add(AppInstall(appName, bitmap, packageName))
        }
    }
    return appList
}

方法2:使用getInstalledPackages()

如果需要获取更多应用细节(比如权限、组件信息),可以用getInstalledPackages():

private fun getAllInstalledAppsWithDetails(context: Context): ArrayList<AppInstall> {
    val appList = ArrayList<AppInstall>()
    val installedPackages = context.packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS)
    
    for (pkgInfo in installedPackages) {
        val appInfo = pkgInfo.applicationInfo
        // 过滤系统应用(可选)
        if ((appInfo.flags and ApplicationInfo.FLAG_SYSTEM) == 0) {
            val appName = appInfo.loadLabel(context.packageManager).toString()
            val appIcon = appInfo.loadIcon(context.packageManager)
            val bitmap = drawableToBitmap(appIcon)
            val packageName = pkgInfo.packageName
            
            appList.add(AppInstall(appName, bitmap, packageName))
        }
    }
    return appList
}
注意事项
  1. 权限要求:
    • Android 10及以下:无需额外权限,直接调用即可。
    • Android 11及以上:需要在AndroidManifest.xml中添加QUERY_ALL_PACKAGES权限(如果需要获取所有应用),或者声明特定的包查询权限(针对目标应用):
      <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
          tools:ignore="QueryAllPackagesPermission" />
      
  2. 过滤系统应用:代码中的(appInfo.flags and ApplicationInfo.FLAG_SYSTEM) == 0用于过滤掉系统预装应用,如果你需要包含系统应用,直接移除这个判断条件即可。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:43:30