Android获取全部用户安装应用失败,同代码在其他应用正常求助
问题分析与解决方案
核心问题1:当前代码逻辑仅获取桌面可启动应用
你现在用的queryIntentActivities配合Intent.CATEGORY_LAUNCHER,本质是获取所有带有桌面启动入口的应用,而非全部已安装应用。很多用户安装的应用(比如纯后台服务类、插件类)没有声明这个分类,所以自然不会被收录。
核心问题2:权限声明错误
你在Manifest里用了<permission>标签,这是用来自定义权限的,而申请系统权限需要用<uses-permission>标签。正确的QUERY_ALL_PACKAGES权限声明应该是:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="ReservedSystemPermission" />
正确获取全部用户安装应用的代码
改用getInstalledApplications方法,同时过滤出用户安装的应用(区分系统应用和用户应用):
@SuppressLint("QueryPermissionsNeeded") public static List<AppInfo> getAllUserInstalledApps(Context context) { List<AppInfo> userApps = new ArrayList<>(); PackageManager pm = context.getPackageManager(); List<ApplicationInfo> allApps = pm.getInstalledApplications(PackageManager.GET_META_DATA); for (ApplicationInfo appInfo : allApps) { // 过滤用户安装的应用:排除原生系统应用,保留用户安装/更新的系统应用 boolean isUserApp = (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 || (appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; if (isUserApp) { AppInfo app = new AppInfo(); app.setAppName(pm.getApplicationLabel(appInfo).toString()); app.setPackageName(appInfo.packageName); app.setIcon(pm.getApplicationIcon(appInfo)); userApps.add(app); } } return userApps; }
补充说明
- 如果应用目标SDK是Android 11(API 30)及以上,除了
QUERY_ALL_PACKAGES权限,也可以通过包可见性声明指定需要访问的应用包名(若不需要全部应用);但你需要全部用户应用的话,QUERY_ALL_PACKAGES是更直接的方式。 - 可以在代码中先检查权限状态:
ContextCompat.checkSelfPermission(context, Manifest.permission.QUERY_ALL_PACKAGES) == PackageManager.PERMISSION_GRANTED,确保权限已被授予。
内容的提问来源于stack exchange,提问作者Moon Monoar
相关产品推荐
相关产品推荐

