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 }
注意事项
- 权限要求:
- Android 10及以下:无需额外权限,直接调用即可。
- Android 11及以上:需要在
AndroidManifest.xml中添加QUERY_ALL_PACKAGES权限(如果需要获取所有应用),或者声明特定的包查询权限(针对目标应用):<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
- 过滤系统应用:代码中的
(appInfo.flags and ApplicationInfo.FLAG_SYSTEM) == 0用于过滤掉系统预装应用,如果你需要包含系统应用,直接移除这个判断条件即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

