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

时间:2013-12-12 15:46:47

标签: android chromecast

我一直在使用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,这意味着我没有任何“钩子”来选择路线等。

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

2 个答案:

答案 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();
  • 通过在您的onStart()中调用以下内容来启动发现:

 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方法。