20

我想获取出现在菜单屏幕中的所有应用程序。但是,现在我只获取用户安装的应用程序或所有应用程序(包括系统应用程序)。

我目前的代码是:

    final PackageManager pm = getActivity().getPackageManager();
    List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_META_DATA);

    ArrayList<PackageInfo> aux = new ArrayList<PackageInfo>();

    for (int i = 0; i < apps.size(); i++) {
        if (apps.get(i).versionName != null && ((apps.get(i).applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 1)) {
            aux.add(apps.get(i)); 
        }

使用此代码,我可以获得用户安装的应用程序,如果我注释“if”指令,我将获得系统应用程序。

所以,我想让用户安装应用程序和应用程序,如联系人、图库等。

更新:

    final PackageManager pm = getActivity().getPackageManager();
    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    List<ResolveInfo> apps = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA);
4

4 回答 4

42
final PackageManager pm = getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

使用 PackageInfo:

private boolean isSystemPackage(PackageInfo packageInfo) {
    return ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}

使用 ResolveInfo:

private boolean isSystemPackage(ResolveInfo resolveInfo) {
    return ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}

使用应用程序信息:

private boolean isSystemPackage(ApplicationInfo applicationInfo) {
    return ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}

这会过滤系统包。看到这个问题。致谢:纳尔逊·拉米雷斯和肯尼斯·埃文斯。

于 2013-07-11T19:14:48.563 回答
8
final PackageManager pm = getActivity().getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA);
于 2013-08-07T07:44:11.067 回答
4

我有同样的要求。最终,我添加了另一个条件来过滤应用列表。我刚刚检查了该应用程序是否具有“启动器意图”。

所以,结果代码看起来像......

PackageManager pm = getPackageManager();
        List<ApplicationInfo> apps = pm.getInstalledApplications(PackageManager.GET_GIDS);

        for (ApplicationInfo app : apps) {
            if(pm.getLaunchIntentForPackage(app.packageName) != null) {
                // apps with launcher intent
                if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1) {
                    // updated system apps

                } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
                    // system apps

                } else {
                    // user installed apps

                }
                appsList.add(app);
            }

        }
于 2015-04-24T19:14:21.323 回答
0

下面的代码将为您提供与操作系统相关的所有系统应用程序。这不包括 YouTube、Gmail 等应用


try {
    ApplicationInfo ai =  getPackageManager().getApplicationInfo(item.packageName, 0);
    if ((ai.flags & ApplicationInfo.FLAG_SYSTEM ) != 0) {
      if((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP ) == 0) {
        appItem.setSystemApp(true);
        Mylog.v("System Apps " + appItem.getAppName());
      }
    }
  } catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
  }
于 2016-07-02T12:13:18.860 回答