Можете ли вы добавить функциональность Chromecast без использования ActionBar

Я работал с примерами приложений от 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 в своем приложении, что означает, что у меня нет никаких «крючков» для выбора маршрута et al.

Кто-нибудь знает, как обойти это?

Начнем с того, что я предлагаю вам перейти на панель приложений appcompat, чтобы вы могли извлечь все преимущества из коробки.

Тем не менее, ответ на ваш вопрос: да, это выполнимо, если вы готовы сделать немного дополнительной работы для управления жизненным циклом и заявить о себе. Я излагаю здесь шаги, чтобы вы могли создать рабочий пример для себя. Требования: иметь appcompat и mediarouter из библиотеки поддержки v7 в вашем проекте, но вам не нужно использовать какой-либо конкретный тип панели действий или нет необходимости использовать MediaRouteButton; На самом деле вы можете инициировать открытие, а остальные – в любой форме или форме, которые вы хотите. Вот шаги:

  • Удостоверьтесь, что appcompat и mediarouter из библиотеки поддержки v7 включены в ваши зависимости. Важно иметь версию посредника v7

  • Сделайте обычную вещь, то есть создайте 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() ваш onRouteAdded() вашего обратного вызова, и по мере его выхода будет вызываться onRouteRemoved() . Теперь вам будет нести ответственность за список допустимых маршрутов в вашем выборе структуры данных.

  • Скажем, ради аргумента вы представляете список пользователям в диалоговом окне (имеет смысл, не так ли?), Когда пользователь видит имя маршрута (т.е. устройство) в пользовательском интерфейсе, и каждый элемент представляет собой RouteInfo . Затем, когда пользователь нажимает на маршрут, вам нужно позвонить

 mMediaRouter.selectRoute(info); 
  • Вышеупомянутый вызов приводит к другому onRouteSelected() вызову вашего вызываемого обратного вызова, который onRouteSelected() , onRouteSelected() . В этом обратном вызове вызовите следующее:
 MediaRouteHelper.requestCastDeviceForRoute(info); 
  • Наконец, это вызовет onDeviceAvailable() вызов onDeviceAvailable() myMediaRouteAdapter и CastDevice вам CastDevice , который вы сможете захватить и использовать. Когда вы закончите маршрут и хотите «отменить выбор», вызовите
 mMediaRouter.selectRoute(mMediaRouter.getDefaultRoute()); 

Надеюсь, этого достаточно, чтобы заставить вас идти.

Я нашел лучшее решение:

  MediaRouteChooserDialog dialog =new MediaRouteChooserDialog(context); dialog.setRouteSelector(mediaRouteSelector); dialog.show(); 

Показывает всплывающее окно и будет вызывать метод onRouteSelected при обратном вызове.