如何使用 Intent 在 android TV 上启动 amazon prime video 应用程序

Posted

技术标签:

【中文标题】如何使用 Intent 在 android TV 上启动 amazon prime video 应用程序【英文标题】:how to launch amazon prime video app on android TV using Intent 【发布时间】:2019-07-22 05:24:45 【问题描述】:

我正在尝试从我自己的 android TV 应用程序中启动 Amazon Prime for TV 应用程序 (https://play.google.com/store/apps/details?id=com.amazon.amazonvideo.livingroom)。不幸的是,PackageManager.getLaunchIntentForPackage() 返回 null。

// called inside a Fragment
val intent = activity?.packageManager?.getLaunchIntentForPackage("com.amazon.amazonvideo.livingroom")
startActivity(intent)

运行时抛出

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.migrateExtraStreamToClipData()' on a null object reference

当然,我的 Android TV 上确实安装了 Amazon Prime for TV。此外,我可以使用此代码成功启动其他应用程序,如 com.google.android.youtube.tvcom.netflix.ninja

关于这个主题有一个类似的问题 (how launch amazon prime video app from within my android app using intent),但它不能解决我的问题 - OP 问题的解决方案是使用 PackageManager(我已经在使用)和 com.amazon.avod.thirdpartyclient,因为应用在手机/平板电脑而不是电视上运行

编辑:Intent.migrateExtraStreamToClipData() on a null object reference 不能解决我的问题。我在我的 Android TV 版本 11.5.09 上安装了 Google Play 服务,而导致另一个问题的错误(据说)已在 9.4.0 中修复。无论如何,公认的解决方案只是避免应用程序崩溃,而不是解决真正的问题。

【问题讨论】:

Intent.migrateExtraStreamToClipData() on a null object reference的可能重复 @KrystianG 我的 Android TV 上确实安装了 Google Play 服务。无论如何,我只为这个特定的包获得空意图,而不是每一个。 【参考方案1】:

您可以在 按照这种方式,它应该可以工作,因为它对我有用

Intent i=new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
            Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);
startActivity(i);`

【讨论】:

我不知道 Amazon Prime 启动器活动名称,所以我不能使用 setComponent(ComponentName),因为 ComponentName 构造函数需要组件类名称(不能为空)。我唯一拥有的是 Amazon Prime 包名称。我尝试使用 Intent.setPackage() 代替,但现在我得到 android.content.ActivityNotFoundException 不仅适用于 Amazon Prime,而且适用于以前工作的 com.netflix.ninja。您是专门为电视版 Amazon Prime 试用您的代码,还是只为其他一些应用程序尝试过代码? 此外,使用 setComponent() 使意图明确,因此设置动作和类别也没有任何意义。这不是意图的使用方式(双关语(这也是)) 当我尝试做类似的事情时,这篇文章帮助了一段时间 ***.com/a/30446616/10201535【参考方案2】:

正如getLaunchIntentForPackage is null for some apps 中所述,问题的根本原因是Android TV 应用使用Intent.CATEGORY_LEANBACK_LAUNCHER 而不是Intent.CATEGORY_LAUNCHER,这导致getLaunchIntentForPackage() 返回null。不过,有些电视应用确实支持Intent.CATEGORY_LAUNCHER,这就是为什么这个问题并不适用于每个应用。

我决定使用 cmets 中提到的解决方案(而不是接受的解决方案),因为它更简单并且需要更少的代码:

val packageName  = "com.amazon.amazonvideo.livingroom"
val pm = activity?.packageManager
val intent = pm?.getLaunchIntentForPackage(packageName) ?: pm?.getLeanbackLaunchIntentForPackage(packageName)
startActivity(intent)

注意 getLeanbackLaunchIntentForPackage() 用作后备机制。这样,Activity 将在 Android TV 和手机/平板电脑上正常启动(请注意,手机/平板电脑和电视通常具有用于相同服务的单独应用,例如 com.amazon.avod.thirdpartyclientcom.amazon.amazonvideo.livingroom

【讨论】:

以上是关于如何使用 Intent 在 android TV 上启动 amazon prime video 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

给TV添加一个投屏热键:基于MTK9269 android 9.0

没有为android.media.tv.action.INITIALIZE_PROGRAMS发送BroadcastReceiver通知

Android TV:如何使用 Leanbak 自定义 android TV 的左侧导航面板?

如何在 PlaybackTransportControlGlue android TV 上动态更改字幕

如何使一个apk既可以在移动端也可以在android-TV中使用?

Android 如何调用系统默认浏览器访问