У меня возникли проблемы с настройкой диалогов MediaRouteChooser / MediaRouteController (мне понадобятся другие макеты, некоторые дополнительные действия).
Кнопка трансляции настраивается путем вызова
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), menu, R.id.media_route_menu_item); внутри onCreateOptionsMenu.
Я понял, что мне нужно расширить MediaRouteDialogFactory, где я возвращаю свой собственный MediaRouteChooserDialogFragment, где я перезаписываю onCreateChooserDialog и возвращаю свой собственный диалог. Однако это должен быть MediaRouteChooserDialog, но нет особого смысла расширять его (вам нужно будет продублировать весь код, потому что все является частным, и вы не можете их использовать, например, mRouter, mCallback).
Мой вопрос в том, как я могу сделать и показать свой собственный диалог и список маршрутов самостоятельно, но при этом сохранить решение CastButtonFactory.setUpMediaRouteButton внутри onCreateOptionsMenu? Я действительно не хочу беспокоиться о состояниях кнопок Chromecast, таких как видимость, состояние соединений, решать, нужно ли мне показывать средство выбора маршрута или контроллер маршрута и т. д. Я даже не уверен, как мне делать список маршрутов / управление обнаружением, поэтому небольшая помощь была бы полезна и по этой теме.
Я решил это самостоятельно, и у меня это отлично работает. Вот что я вкратце сделал, возможно, это дает некоторые идеи.
Я создал 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.
Таким образом, я мог полностью кастомизироваться, но потребовалась дополнительная работа.
Несмотря на то, что сегодня это может сработать, я был бы предельно осторожен, поскольку каждое обновление фреймворка потенциально может нарушить работу