您是否可以在不使用ActionBar的情况下添加Chromecast功能

Gra*_*eme 3 android chromecast

我一直在使用Google的示例应用程序来准备我们的Chromecast功能,

然而,我发现你需要ActionBar(由谷歌实施)中有一个按钮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;
}
Run Code Online (Sandbox Code Playgroud)

完整,整个示例和API似乎是热线连接到使用此按钮的中心.我很好地重现了Android试图在这里使用的外观和感觉 - 但我在我的应用程序中使用自定义ActionBar,这意味着我没有任何"钩子"来选择路线等.

有谁知道如何解决这个问题?

Ali*_*daf 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();
Run Code Online (Sandbox Code Playgroud)
  • 通过调用onStart()中的以下内容来启动发现:

 mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback,
                        MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
Run Code Online (Sandbox Code Playgroud)
  • 在自定义回调中MyMediaRouterCallback,在添加或删除路由时侦听路由.当路由被发现时,你onRouteAdded()的回调方法将被调用,当它们消失时,onRouteRemoved()将调用它.您现在有责任在您选择的数据结构中保留有效路由列表.

  • 让我们说,为了论证,你在一个对话框中呈现给用户的列表(有意义,不是吗?),其中用户在UI中看到路由(即设备)的名称,每个项目代表一个RouteInfo.然后,当用户点击路线时,您需要拨打电话


mMediaRouter.selectRoute(info);

Run Code Online (Sandbox Code Playgroud)
  • 上面的调用会导致调用自定义回调的另一个回调函数onRouteSelected().在该回调中,请调用以下内容:

MediaRouteHelper.requestCastDeviceForRoute(info);

Run Code Online (Sandbox Code Playgroud)
  • 最后,这将调用the的onDeviceAvailable()回调myMediaRouteAdapter并传递CastDevice给你,你应该能够抓取并使用它.当您完成路线并想要"取消选择"它时,请致电

mMediaRouter.selectRoute(mMediaRouter.getDefaultRoute());

Run Code Online (Sandbox Code Playgroud)

希望这足以让你前进.

  • 现在我们的github repo(https://github.com/googlecast/MediaRouter-Cast-Button-android)上有一个示例项目正在做类似的事情.查看该项目中的MediaRouterDiscoveryActivity类. (3认同)