【问题标题】:Chromecast Button only appears after backgrounding the appChromecast 按钮仅在应用程序后台运行后出现
【发布时间】:2020-03-12 01:15:10
【问题描述】:

很简单的情况。将Chromecast 按钮添加到toolbar。首次启动应用程序时,该按钮不会出现。当我将应用程序置于后台,然后再次将其置于前台时,会出现该按钮。是的,在同一个 wifi 网络上有一个可投射设备。

MyFragment.kt

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {

    inflater.inflate(R.menu.toolbar_menu, menu)

    CastButtonFactory
        .setUpMediaRouteButton(context?.applicationContext, menu, R.id.media_route_menu_item)

    return super.onCreateOptionsMenu(menu, inflater)
}

toolbar_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/media_route_menu_item"
        android:title="@string/media_route_menu_title"
        app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"
        app:showAsAction="always" />
</menu>

似乎应该这样做。我有具有正确接收器 ID 的 CastOptionsProvider 类设置。这是一个调试版本,所以没有 proguard。

请注意,该按钮最终会出现,但仅在我将应用程序置于后台/前台之后。我可以等待 10 分钟,但没有任何反应。但如果我是背景/前景,按钮立即可见。

编辑:
非常感谢@fllo 的回答。他的建议比最终要求的要多一些,所以我想为其他人澄清一下。

我发布的代码很好。我所缺少的只是在Activity 的 onCreate() 中初始化 CastContext。如果我只是考虑一下,那就完全有道理了。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    CastContext.getSharedInstance(this)
}

就是这样。轻松解决。希望它可以帮助某人。

【问题讨论】:

    标签: android chromecast


    【解决方案1】:

    您需要确保在创建 Fragment 实例之前初始化 Cast SDK。

    移动 Cast SDK 初始化代码 (CastButtonFactory with setUpMediaRouteButton()CastStateListenerIntroductoryOverlay)进入父 Activity 将按预期工作。然后,也许只是默认隐藏 MenuItem 并从您的 Fragment 中显示它应该可以解决问题。

    根据the documentation,MediaRouteButton 应该在 FragmentActivity 中。我的猜测是回调不是从 Fragment 调用的,那么它的可见性不会动态变化。因此,您需要在接收更新时将其从 Activity 中转换并传递给 Fragment。不是很优雅,但它应该可以工作。

    【讨论】:

    • 谢谢。这基本上是正确的,并解决了我的问题。问题很简单。正如你所提到的,我没有足够早地打电话给CastContext.getSharedInstance(this)。回调和侦听器与它没有任何关系,我不需要将它传递给片段。
    • 非常感谢您的帮助。我将使用最终解决方案更新我的 OP,以便为其他人澄清。非常感谢!
    • 我们在将 Cast SDK 用于 React Native 应用程序时也遇到了这个问题,发现为了识别本地 Cast 接收器设备,我们必须在 onCreate 中调用 CastContext.getSharedInstance(this)本地主机应用程序,而不是等到 React Native 模块上的 createViewInstance 调用它。
    猜你喜欢
    • 2014-01-10
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2013-04-11
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多