获取 Android 设备(尤其是 Android 电视)上所有应用的列表

Fetch list of all apps on Android device (esp. Android TV)

我正在尝试获取 Android 电视(Nexus Player)上所有可启动应用程序的列表 运行 5.1.1.

private static Set<ResolveInfo> getInstalledAppsFrom(PackageManager packageManager) {
    Set<ResolveInfo> activities = new HashSet<>();
    activities.addAll(launcherActivitiesIn(packageManager));
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activities.addAll(leanbackActivitiesIn(packageManager));
    }
    return activities;
}

private static List<ResolveInfo> launcherActivitiesIn(PackageManager packageManager) {
    Intent intent = new Intent()
            .setAction(Intent.ACTION_MAIN)
            .addCategory(Intent.CATEGORY_LAUNCHER);
    return getResolveInfos(packageManager, intent);
}

private static List<ResolveInfo> getResolveInfos(PackageManager packageManager, Intent intent) {
    return packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static List<ResolveInfo> leanbackActivitiesIn(PackageManager packageManager) {
    Intent intent = new Intent()
            .setAction(Intent.ACTION_MAIN)
            .addCategory(Intent.CATEGORY_LEANBACK_LAUNCHER);
    return getResolveInfos(packageManager, intent);
}

使用上面的方法,我可以得到一个应用程序列表,但它看起来不像完整的列表:设备上安装了 Netflix 但没有显示,显然缺少设置。

运行 Android phone 运行 5.1.1 上的相同代码将包含“设置”应用程序。

CATEGORY_LAUNCHER and/or CATEGORY_LEANBACK_LAUNCHER 是否有可能阻止某些应用程序显示的内容?

我也试过:

packageManager.getInstalledApplications(PackageManager.PERMISSION_GRANTED);

效果相同。

完整代码(在写这个问题的时候)可以是checked out on Github here, where the snippets are from the AppsRepository class

问题没有包含足够的细节来正确回答。 Set<ResolveInfo> 是正确的 - 它包含 Netflix 的条目。

问题来自尝试使用它们:

Intent launchIntent = packageManager.getLaunchIntentForPackage(applicationInfo.packageName);

这里,launchIntent可以为空,即使包名是正确的。还有另一个调用可能 return 正确的 Intent:

Intent launchIntent = packageManager.getLeanbackLaunchIntentForPackage(applicationInfo.packageName);

仍然找不到启动系统设置的意图。只有 Google 显示为 Play 服务的设置。 如果有人能解决这个问题,将更改已接受的答案!