2013-12-12 2 views
3

Я работаю из примеров приложений от Google, чтобы подготовить наши возможности Chromecast,Вы можете добавить функциональность Chromecast без использования ActionBar

Что я нашел, однако, что вы требуется иметь кнопку в 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.

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

ответ

5

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

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

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

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

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


mMediaRouter.selectRoute(info); 

  • Вышеприведенные результаты вызова в другом обратном вызове пользовательской функции обратного вызова будут вызваны, onRouteSelected(). В этой функции обратного вызова, вызовите следующее:

MediaRouteHelper.requestCastDeviceForRoute(info); 

  • Наконец, это будет вызывать onDeviceAvailable() обратного вызова myMediaRouteAdapter и передает CastDevice, к которому Вы должны быть в состоянии захватить и использовать. Когда вы закончите с маршрутом и хотите «отменить» его, вызовите

mMediaRouter.selectRoute(mMediaRouter.getDefaultRoute()); 

Надеется, что достаточно, чтобы ты.

+1

Очень полезно - 'onRouteAdded()' был частью головоломки, которую я отсутствовал. Спасибо! – Graeme

+3

Теперь в нашем реестре github (https://github.com/googlecast/MediaRouter-Cast-Button-android) выполняется пример проекта, который делает что-то похожее на это; проверьте класс MediaRouterDiscoveryActivity в этом проекте. –

+0

Спасибо Али Наддаф. –

1

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

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

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

+0

Можете ли вы дать некоторое объяснение, как вы его используете ...? также любая подсказка y downvote? – sirvon

+0

Мое решение немного изменилось, и я использую в макете элемент: Хотел бы я знать, почему downvote - решение работало для меня отлично. – Magillus

+0

При использовании этого я получаю 'java.lang.IllegalArgumentException: фон не может быть полупрозрачным: # 0' ошибка. Не уверен, почему, не уверен, где искать помощь, но я не думаю, что этот ответ завершен. – Krystian

Смежные вопросы