Chromecast 按钮仅在应用后台运行后出现

Chromecast Button only appears after backgrounding the app

情况很简单。将 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>

看来应该可以了。我有 CastOptionsProvider class 设置和正确的接收者 ID。这是调试版本,因此没有混淆器。

请注意,该按钮最终会出现,但只有在我 background/foreground 应用程序之后才会出现。我可以等 10 分钟,但什么也没有发生。但是如果我 background/foreground,按钮立即可见。

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

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

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

就是这样。简单的解决方案。希望对大家有帮助。

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

移动Cast SDK初始化代码 (CastButtonFactory with setUpMediaRouteButton(), CastStateListener and IntroductoryOverlay) 进入父 Activity 将按预期工作。然后,也许只是默认隐藏 MenuItem 并从 Fragment 中显示它就可以了。

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