CastCompanionLibrary检测网络上Chromecast设备的存在

时间:2015-04-22 21:29:22

标签: android chromecast google-cast

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

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

在我们的活动中,我们在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);
        }
    …..

并执行decrementUiCounter并从onPause中的manager中删除videoCastConsumer,如实现文档所述。

然而,我们确实观察到奇怪的是,在我们对应用程序进行后台处理和前台处理后,onCastAvailabilityChanged和onCastDeviceDetected回调总是被触发。 为什么会这样?有没有办法在活动加载时或至少在onResume / onPause上复制此行为?

编辑:值得一提的是,我们尝试调用mCastManager.startCastDiscovery,但是在我们再次背景/重新启动之前,没有调用回调。

2 个答案:

答案 0 :(得分:2)

有两件事需要发生:(1)应用程序应该注册自己,以便在路由可用性发生变化时得到通知;(2)它们应该能够获得当前状态,即查看是否存在是那个时刻可用的任何路线。然后在每个具有MediaRouterButton的活动中,都应该使用这两个活动;首先注册回调,然后直接调用以查看是否有可用的路由。这将在启动时设置状态电流,并且回调使状态保持最新状态。

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

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

答案 1 :(得分:0)

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

stopCastDiscovery()删除了mediaroute回调。这是什么原因? (● - ●)