如何使用 Intent 在 android 电视上启动亚马逊 Prime 视频应用
how to launch amazon prime video app on android TV using Intent
我正在尝试从我自己的 Android 电视应用中启动亚马逊 Prime 电视应用 (https://play.google.com/store/apps/details?id=com.amazon.amazonvideo.livingroom)。不幸的是,PackageManager.getLaunchIntentForPackage()
returns 无效。
// 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 电视上安装了 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
,因为该应用 运行 宁 phone/tablet 而不是电视
编辑: 没有解决我的问题。我在我的 Android 电视上安装了 Google Play 服务,版本 11.5.09,而导致另一个问题的错误已(据说)在 9.4.0 中修复。无论如何,公认的解决方案只是为了避免应用程序崩溃,而不是解决真正的问题。
您可以在
按照这种方式,它应该可以工作,因为它对我有用
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);`
如 中所述,问题的根本原因是 Android TV 应用程序使用 Intent.CATEGORY_LEANBACK_LAUNCHER
而不是 Intent.CATEGORY_LAUNCHER
,这导致 getLaunchIntentForPackage()
为 return 空。不过,某些电视应用确实支持 Intent.CATEGORY_LAUNCHER
,这就是为什么该问题并不适用于每个应用的原因。
我决定使用评论中提到的解决方案(而不是接受的解决方案),因为它更简单并且需要更少的代码:
val packageName = "com.amazon.amazonvideo.livingroom"
val pm = activity?.packageManager
val intent = pm?.getLaunchIntentForPackage(packageName) ?: pm?.getLeanbackLaunchIntentForPackage(packageName)
startActivity(intent)
注意 getLeanbackLaunchIntentForPackage()
用作回退机制。这样,activity 将在 Android 电视和 phone/tablet 上正常启动(请注意 phone/table 和电视通常针对相同的服务有单独的应用程序,例如 com.amazon.avod.thirdpartyclient
和 com.amazon.amazonvideo.livingroom
)
我正在尝试从我自己的 Android 电视应用中启动亚马逊 Prime 电视应用 (https://play.google.com/store/apps/details?id=com.amazon.amazonvideo.livingroom)。不幸的是,PackageManager.getLaunchIntentForPackage()
returns 无效。
// 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 电视上安装了 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
,因为该应用 运行 宁 phone/tablet 而不是电视
编辑:
您可以在 按照这种方式,它应该可以工作,因为它对我有用
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);`
如 Intent.CATEGORY_LEANBACK_LAUNCHER
而不是 Intent.CATEGORY_LAUNCHER
,这导致 getLaunchIntentForPackage()
为 return 空。不过,某些电视应用确实支持 Intent.CATEGORY_LAUNCHER
,这就是为什么该问题并不适用于每个应用的原因。
我决定使用评论中提到的解决方案(而不是接受的解决方案),因为它更简单并且需要更少的代码:
val packageName = "com.amazon.amazonvideo.livingroom"
val pm = activity?.packageManager
val intent = pm?.getLaunchIntentForPackage(packageName) ?: pm?.getLeanbackLaunchIntentForPackage(packageName)
startActivity(intent)
注意 getLeanbackLaunchIntentForPackage()
用作回退机制。这样,activity 将在 Android 电视和 phone/tablet 上正常启动(请注意 phone/table 和电视通常针对相同的服务有单独的应用程序,例如 com.amazon.avod.thirdpartyclient
和 com.amazon.amazonvideo.livingroom
)