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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:40:18