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()
删除媒体路由回调。是这个原因吗? (●-●)
根据 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()
删除媒体路由回调。是这个原因吗? (●-●)