我一直在使用Google的示例应用程序来准备我们的Chromecast功能,
但我发现,您必需在ActionBar
(由Google实施)中设置按钮,以便按顺序获得ActionProvider
将选择器附加到。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.main, menu);
MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
MediaRouteActionProvider mediaRouteActionProvider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouteMenuItem);
mediaRouteActionProvider.setRouteSelector(mCaster.getMediaRouteSelector());
return true;
}
完整,整个示例和API似乎都是热线连接到使用此按钮的中心。我很好地重现了Android试图在这里使用的外观和感觉 - 但我在我的应用程序中使用自定义ActionBar,这意味着我没有任何“钩子”来选择路线等。
有谁知道如何解决这个问题?
答案 0 :(得分:5)
首先,我建议您考虑转移到appcompat操作栏,这样您就可以获得开箱即用的所有好处。
那就是说,你的问题的答案是:是的,如果你愿意做一些额外的工作来管理生命周期并自己陈述,这是可行的。我概述了这里的步骤,以便您可以为自己创建一个工作示例。要求是在项目中使用v7支持库的appcompat和mediarouter,但不需要使用任何特定类型的操作栏,也不需要使用MediaRouteButton;实际上,您可以以任何您想要的形状或形式触发发现和其余部分。以下是步骤:
确保来自v7支持库的appcompat和mediarouter包含在您的依赖项中。拥有v7版本的mediarouter
执行常规操作,即构建CastContext
并将阶段设置为可供发现(您需要创建MediaRouteAdapter
的实例,我将其称为myMediaRouteAdapter
) :
mCastContext = new CastContext(getApplicationContext());
MediaRouteHelper.registerMinimalMediaRouteProvider(mCastContext,
myMediaRouteAdapter);
mMediaRouter = MediaRouter.getInstance(getApplicationContext());
mMediaRouteSelector = MediaRouteHelper
.buildMediaRouteSelector(MediaRouteHelper.CATEGORY_CAST,
"YOUR_APP_NAME", null);
mMediaRouterCallback = new MyMediaRouterCallback();
mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,
MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
在自定义回调MyMediaRouterCallback
中,在添加或删除路由时侦听路由。当路由被发现时,您的onRouteAdded()
回调方法将被调用,当它们消失时,将调用onRouteRemoved()
。您现在有责任在您选择的数据结构中保留有效路线列表。
让我们说,为了论证,你在一个对话框中呈现给用户的列表(有意义,不是吗?),其中用户在UI中看到路由(即设备)的名称,每个项目代表一个RouteInfo
。然后,当用户点击路线时,您需要致电
mMediaRouter.selectRoute(info);
onRouteSelected()
。在该回调中,请调用以下内容:
MediaRouteHelper.requestCastDeviceForRoute(info);
onDeviceAvailable()
的{{1}}回调,并将myMediaRouteAdapter
传递给您,您应该可以抓取并使用它。当您完成路线并想要“取消选择”它时,请致电CastDevice
希望这足以让你前进。
答案 1 :(得分:0)
我找到了更好的解决方案:
MediaRouteChooserDialog dialog =new MediaRouteChooserDialog(context);
dialog.setRouteSelector(mediaRouteSelector);
dialog.show();
显示弹出窗口并在回调时调用onRouteSelected方法。