我正在尝试获取运行 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 类。