获取 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 服务的设置。 如果有人能解决这个问题,将更改已接受的答案!
我正在尝试获取 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 服务的设置。 如果有人能解决这个问题,将更改已接受的答案!