Я работал с примерами приложений от 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();
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 при обратном вызове.