Пользовательский MediaRouteChooserDialog Chromecast

У меня возникли проблемы с настройкой диалогов MediaRouteChooser / MediaRouteController (мне понадобятся другие макеты, некоторые дополнительные действия).

Кнопка трансляции настраивается путем вызова CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), menu, R.id.media_route_menu_item); внутри onCreateOptionsMenu.

Я понял, что мне нужно расширить MediaRouteDialogFactory, где я возвращаю свой собственный MediaRouteChooserDialogFragment, где я перезаписываю onCreateChooserDialog и возвращаю свой собственный диалог. Однако это должен быть MediaRouteChooserDialog, но нет особого смысла расширять его (вам нужно будет продублировать весь код, потому что все является частным, и вы не можете их использовать, например, mRouter, mCallback).

Мой вопрос в том, как я могу сделать и показать свой собственный диалог и список маршрутов самостоятельно, но при этом сохранить решение CastButtonFactory.setUpMediaRouteButton внутри onCreateOptionsMenu? Я действительно не хочу беспокоиться о состояниях кнопок Chromecast, таких как видимость, состояние соединений, решать, нужно ли мне показывать средство выбора маршрута или контроллер маршрута и т. д. Я даже не уверен, как мне делать список маршрутов / управление обнаружением, поэтому небольшая помощь была бы полезна и по этой теме.

2
0
315
1

Ответы 1

Я решил это самостоятельно, и у меня это отлично работает. Вот что я вкратце сделал, возможно, это дает некоторые идеи.

Я создал CustomMediaRouteDialogFactory, который расширяет MediaRouteDialogFactory и предоставил мои собственные диалоги, переопределив onCreateChooserDialogFragment и onCreateControllerDialogFragment. Эти диалоги расширяют исходные диалоги выбора и контроллера из фреймворка.

Состояние кнопки приведения на панели инструментов по-прежнему управляется автоматически, я просто передал поставщику свой собственный селектор маршрутов и фабрику диалогов.

onCreateOptionsMenu:

MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
MediaRouteActionProvider mediaRouteActionProvider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider(mediaRouteMenuItem);
mediaRouteActionProvider.setRouteSelector(chromecastManager.getMediaRouteSelector());
mediaRouteActionProvider.setDialogFactory(mediaRouteDialogFactory);

Обратная сторона: В итоге я написал собственный код обнаружения и фильтрации маршрутов, изучив исходный код реализации диалогового окна выбора фреймворка и некоторые другие зависимости. Во-вторых, диалог контроллера напрямую взаимодействует с RemoteMediaClient.

Таким образом, я мог полностью кастомизироваться, но потребовалась дополнительная работа.

Несмотря на то, что сегодня это может сработать, я был бы предельно осторожен, поскольку каждое обновление фреймворка потенциально может нарушить работу

Shyri 28.04.2020 13:43

Другие вопросы по теме