如何使用 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.tv
或 com.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.thirdpartyclient
和 com.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 上动态更改字幕