【发布时间】:2015-08-07 09:21:13
【问题描述】:
我正在构建一项服务,将已安装应用程序列表从 Android TV 或 Fire TV 发送到手机。然后手机发回它想要启动的应用程序的包名称,服务将启动它。
这是创建列表的代码
public List<InstalledApp> GetInstalledApps(boolean isAndroid) {
PackageManager pm = getPackageManager();
List<ApplicationInfo> allPackages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
List<InstalledApp> userPackages = new ArrayList<InstalledApp>();
for (ApplicationInfo packageInfo : allPackages) {
if (isSystemPackage(packageInfo)) continue;
InstalledApp app = new InstalledApp();
app.setPackageName(packageInfo.packageName);
app.setAppName(pm.getApplicationLabel(packageInfo).toString());
if (!isAndroid) {
app.setIcon(pm.getApplicationIcon(packageInfo));
}
app.setAccentColor(getAccentColor(pm.getApplicationIcon(packageInfo)));
userPackages.add(app);
}
return userPackages;
}
这就是我启动应用程序的方式
public void launchApp(String packageName) {
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(packageName);
startActivity(intent);
}
在 Fire TV 上一切正常,但在 Android TV 上,许多应用的意图始终为空。这些只是其中的一部分。
- com.haystack.android
- com.netflix.ninja
- tv.pluto.android
- com.bamnetworks.mlbtv
但是使用相同的代码,这些应用程序运行良好。
- com.hulu.livingroomplus
- com.sling
- com.frogmind.badland
- com.songza.tv
谁能提供任何关于我可能做错了什么的见解?
谢谢!
编辑: 我也试过这个,我得到了例外
android.content.ActivityNotFoundException:未找到处理 Intent 的 Activity { cat=[android.intent.category.LEANBACK_LAUNCHER] flg=0x10000000 pkg=com.netflix.ninja }
public void launchApp(String packageName) {
Intent intent = new Intent();
intent.setPackage(packageName);
intent.addCategory("android.intent.category.LEANBACK_LAUNCHER");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
编辑 2:
这是适合我的代码:
public void launchApp(String packageName) {
Intent intent = new Intent();
intent.setPackage(packageName);
PackageManager pm = getPackageManager();
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(pm));
if(resolveInfos.size() > 0) {
ResolveInfo launchable = resolveInfos.get(0);
ActivityInfo activity = launchable.activityInfo;
ComponentName name=new ComponentName(activity.applicationInfo.packageName,
activity.name);
Intent i=new Intent(Intent.ACTION_MAIN);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);
startActivity(i);
}
}
【问题讨论】:
-
请记住,在 Android TV 上,
LEANBACK_LAUNCHER是启动器的类别,而不是手机和平板电脑上的LAUNCHER。我的猜测是这些应用程序没有LAUNCHER活动,并且getLaunchIntentForPackage()仅适用于LAUNCHER,不适用于LEANBACK_LAUNCHER。 -
我尝试手动设置意图的包名称并添加类别
android.intent.category.LEANBACK_LAUNCHER,但它仍然不起作用。我确定 Netflix 有一个LEANBACK_LAUNCHER。如果这很重要,我的目标是 SDK 版本 17-21。 -
“我尝试为意图设置包名称并添加类别 android.intent.category.LEANBACK_LAUNCHER 但它仍然不起作用” - 我不知道你的意思在您现有代码的上下文中。欢迎您使用
queryIntentActivities()查找所有LEANBACK_LAUNCHER活动。那(尽管使用LAUNCHER)是主屏幕的作用,而不是使用getLaunchIntentForPackage())。这是一个示例主屏幕式启动器:github.com/commonsguy/cw-omnibus/tree/master/Introspection/… -
您是否尝试过使用
getLeanbackLaunchIntentForPackage()? -
非常感谢编辑 2!我已经构建了一个启动器,但未能从中启动另一个启动器,因为 pm.getLaunchIntentForPackage 返回 null。你的代码在这个问题上就像一个魅力
标签: android android-tv amazon-fire-tv nexus-player