我正在建立一个服务,从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
有谁能提供一些关于我可能做错了什么的见解吗?
EDIT:
我也试过这样做,但我得到的例外情况是
android.content.ActivityNotFoundException。No Activity found to handle Intent { 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);
EDIT 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);