0

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

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 已安装在设备上但未显示,显然缺少设置。

在运行 5.1.1 的 Android 手机上运行相同的代码将包括设置应用程序。

是否有一些关于CATEGORY_LAUNCHER和/或CATEGORY_LEANBACK_LAUNCHER可能会阻止某些应用程序出现的内容?

我也试过:

packageManager.getInstalledApplications(PackageManager.PERMISSION_GRANTED);

达到同样的效果。

完整的代码(在写这个问题的时候)可以在 Github 上查看,这里的代码片段来自AppsRepository 类

4

1 回答 1

0

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

问题来自尝试使用它们:

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

在这里,launchIntent即使包名正确,也可以为空。还有另一个调用可能会返回正确的 Intent:

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

尽管如此,还是找不到启动系统设置的意图。仅显示为 Play 服务的 Google 设置。如果有人能解决这个问题,将改变接受的答案!

于 2015-06-14T16:38:56.997 回答