2

タイトルのとおり、ランチャーの意図を持つアプリケーションのみを表示するソリューションを探しています。アプリリストを取得するコードは次のとおりです。

public static List<ApplicationInfo> getInstalledApplication(Context context) {
    PackageManager packageManager = context.getPackageManager();
    List<ApplicationInfo> apps = packageManager.getInstalledApplications(0);
    Collections.sort(apps, new ApplicationInfo.DisplayNameComparator(packageManager));
    return apps;
}

ランチャーの意図なしにすべてのパッケージを削除するルールを追加することは可能ですか? ありがとう

4

2 に答える 2

6

使用できますqueryIntentActivities()

Intent intent = new Intent()
    .setAction(Intent.ACTION_MAIN)
    .addCategory(Intent.CATEGORY_LAUNCHER);
PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
List<ApplicationInfo> appInfoList = new ArrayList<>();
for (ResolveInfo info : list) {
    ApplicationInfo appInfo = packageManager.getApplicationInfo(info.activityInfo.packageName, PackageManager.GET_META_DATA);
    appInfoList.add(appInfo);
}
Collections.sort(appInfoList, new ApplicationInfo.DisplayNameComparator(packageManager));

これにより、Launcher アクティビティですべてのインテントが得られるはずです。MATCH_DEFAULT_ONLY は、アプリの既定のランチャー アクティビティとしてフラグが立てられたアクティビティのみを取得するようにする必要があることに注意してください。

編集: MATCH_DEFAULT_ONLY には注意してください。インストールされているアプリの数が減る可能性があります。

于 2013-12-23T14:05:32.063 に答える
4

marcus.ramsden が提供するコードの pices を使用して、自分で解決することができました。

public static List<ApplicationInfo> getInstalledApplication(Context context) {
    PackageManager packageManager = context.getPackageManager();
    List<ApplicationInfo> apps = packageManager.getInstalledApplications(0);
    List<ApplicationInfo> appInfoList = new ArrayList();
    for (ApplicationInfo info : apps) {
        if (packageManager.getLaunchIntentForPackage(info.packageName) != null) {
            appInfoList.add(info);
        }
    }
    Collections.sort(appInfoList, new ApplicationInfo.DisplayNameComparator(packageManager));
    return appInfoList;
}
于 2013-12-23T14:23:04.883 に答える