CastCompanionLibrary 检测网络上是否存在 Chromecast 设备

CastCompanionLibrary detecting presence of Chromecast devices on network

根据 CastCompanionLibrary 文档启动具有 MediaRouteButton 的 activity 时,即使网络中有 Chromecast 设备,该按钮也不会显示。 (请注意,这里的 MediaRouteButton 不在 ActionBar 中;我们在这里讨论的 activity 实际上没有 ActionBar,但它扩展了 ActionBarActivity。我们应用程序中的其他活动根据docs,当网络中有 Chromecast 设备时,它会正常运行。)

我们观察到 VideoCastConsumer 中的 onCastAvailabilityChanged(以及 onCastDeviceDetected)未被调用。我们跟踪代码发现 /cast/CastMediaRouterCallback.java 中的 onRouteAdded 在 activity 启动时没有被调用。

在我们的 activity 中,我们在 onResume

中创建消费者
@Override
    protected void onResume() {
        mCastManager = VideoCastManager.getInstance();
        if (mCastManager != null) {
            mVideoCastConsumer = new VideoCastConsumerImpl() {
                .....
                @Override
                public void onCastAvailabilityChanged(boolean castPresent) {
                    mMediaRouteButton.setVisibility(castPresent ? View.VISIBLE : View.GONE);
                }
                .....
            }
            mCastManager.incrementUiCounter();
            mCastManager.addVideoCastConsumer(mVideoCastConsumer);
        }
    …..

并在 onPause 中执行 decrementUiCounter 并从管理器中删除 videoCastConsumer,如实施文档所述。

但是,我们确实观察到奇怪的是 onCastAvailabilityChanged 和 onCastDeviceDetected 回调 always 在我们后台和前台应用程序后被触发。 知道为什么会这样吗?有没有办法复制这种行为发生在 activity 负载或至少在 onResume/onPause?

编辑:值得一提的是,我们尝试调用 mCastManager.startCastDiscovery,但直到我们再次 backgrounded/foregrounded 才调用回调。

有两件事需要发生:(1) 应用程序应自行注册,以便在路由可用性发生变化时收到通知;(2) 它们应该能够获取当前状态,即查看当时是否有可用的路线。然后在每个有 MediaRouterButton 的 activity 中,这两个都应该被使用;先注册回调,然后直接调用,看看有没有可用的路由。这将在启动时将状态设置为当前状态,并且回调将状态保持为当前状态。

我很快就会在 CCL 的这方面做一些小的改动,以使这两个步骤更加健壮,所以如果你能等几天,你应该能够看到更新的版本;如果你不能,那么你可能需要在你这边做一些工作。

更新:在 CCL v2.0.1 中,进行了一些更改以使该过程更加健壮;你基本上需要注册到回调 onCastAvailabilityChanged() 并且当你启动一个有按钮的 activity 时,调用 VideoCastManager.isAnyRouteAvailable() 来设置投射按钮的初始可见性。

我有一个适合我的解决方案:致电 mCastManager.stopCastDiscovery(); 首先在 Acitivity 的 onCreate() 上。

stopCastDiscovery() 删除媒体路由回调。是这个原因吗? (●-●)