Android Cast - обратный вызов Media Router не возвращается
Я пытаюсь автоматически обнаружить устройства Cast. Это в основном дословно то, что я видел, как это сделать, однако я никогда не получаю обратный вызов ни для onRouteAdded, ни для onRouteSelected.
Я пытался изменить, какие флаги используются, но не получил других результатов. Иногда маршрут будет добавлен, но никогда не будет выбран.
private void startSearchForDevicesAndCast() {
MediaRouter router = MediaRouter.getInstance(this);
int count = router.getRoutes().size();
List<MediaRouter.RouteInfo> j = router.getRoutes();
MediaRouteSelector selector = new MediaRouteSelector.Builder().addControlCategory(
CastMediaControlIntent.categoryForCast(getString(R.string.app_id))).build();
router.addCallback(selector, new MediaRouter.Callback() {
@Override
public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteAdded(router, route);
Log.i(TAG, "onRouteAdded: ");
router.selectRoute(route);
}
@Override
public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo route) {
super.onRouteChanged(router, route);
Log.i(TAG, "onRouteChanged: ");
}
@Override
public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
Log.i(TAG, "onRouteSelected: ");
super.onRouteSelected(router, route);
}
}, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
}
1 ответ
Я верю в ваше дело, вам нужно сделать немного больше. В зависимости от настроек и структуры вашего приложения и некоторых других факторов, ожидаемый маршрут может быть уже обнаружен MediaRouter. В этом случае вы не получите onRouteAdded(), поскольку он уже существует. Чтобы приспособиться к этому, один подход после вызова router.addCallback(..)
(как вы уже делаете), получить список всех существующих маршрутов, позвонив mMediaRouter.getRoutes()
а затем отфильтруйте список для интересующего вас идентификатора приложения (используя тот же селектор, который вы определили, и используя route.matchesSelector(selector)
) и примите это как исходный набор обнаруженных устройств. С этого момента onRouteAdded()
а также onRouteRemoved()
может быть использован для обновления списка. Что касается onRouteChanged()
, который иногда имеет ценную информацию; например, когда устройство приведения перезагружается и когда оно появляется, в самом начале оно может иметь неправильную конфигурацию, но вскоре после этого оно получает свою конфигурацию и обновляет определенные поля, а затем onRouteChanged()
вызывается, но в большинстве случаев вы можете игнорировать это и просто сосредоточиться на начальном наборе и тех, которые добавляются или удаляются. Если вы хотите увидеть, как это можно составить, обратите внимание, что то, что я изложил выше, очень близко к тому, что MediaRouterChooserDialog делает внутренне, и, поскольку его источник открыто доступен в библиотеке поддержки Media Router v7, вы можете посмотреть и посмотреть как это можно сделать.