Отфильтровывать не запускаемые приложения при получении всех установленных приложений

Im работает над приложением, где я хочу представить пользователю все установленные приложения и позволить ему выбрать один, а затем что-то сделать с ним. Я последовал за учебником (это: http://impressive-artworx.de/2011/list-all-installed-apps-in-style/), хотя у меня возникают некоторые проблемы. После выполнения этого урока я получил только те приложения, которые не были предварительно установлены (как и все фоновые приложения, которые не запускаются), что отлично, если вы хотите, чтобы приложения, загруженные пользователем из магазина воспроизведения. Проблема в том, что в моем приложении я хочу отображать запускаемые системные приложения, такие как Youtube и Browser, но не не запускаемые, такие как Search Application Provider.

Вот код, который я использую, когда вы получаете приложения:

private List<App> loadInstalledApps(boolean includeSysApps) {
  List<App> apps = new ArrayList<App>();

  // the package manager contains the information about all installed apps
  PackageManager packageManager = getPackageManager();

  List<PackageInfo> packs = packageManager.getInstalledPackages(0); //PackageManager.GET_META_DATA 

  for(int i=0; i < packs.size(); i++) {
     PackageInfo p = packs.get(i);
     ApplicationInfo a = p.applicationInfo;

     App app = new App();
     app.setTitle(p.applicationInfo.loadLabel(packageManager).toString());
     app.setPackageName(p.packageName);
     app.setVersionName(p.versionName);
     app.setVersionCode(p.versionCode);
     CharSequence description = p.applicationInfo.loadDescription(packageManager);
     app.setDescription(description != null ? description.toString() : "");
     apps.add(app);
  }
  return apps;
  }

Теперь мой вопрос: Каков наилучший способ отфильтровать незапущенные приложения?

Любая помощь приветствуется!

Ответ 1

Лучший способ:

public static List<ApplicationInfo> getAllInstalledApplications(Context context) {
    List<ApplicationInfo> installedApps = context.getPackageManager().getInstalledApplications(PackageManager.PERMISSION_GRANTED);
    List<ApplicationInfo> launchableInstalledApps = new ArrayList<ApplicationInfo>();
    for(int i =0; i<installedApps.size(); i++){
        if(context.getPackageManager().getLaunchIntentForPackage(installedApps.get(i).packageName) != null){
            //If you're here, then this is a launch-able app
            launchableInstalledApps.add(installedApps.get(i));
        }
    }
    return launchableInstalledApps;
}