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, вы можете посмотреть и посмотреть как это можно сделать.

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