Поддержка Android v7 MediaRouter иногда не работает должным образом

Я использую библиотеку поддержки V7 MediaRouter для переключения маршрутов между громкоговорителем телефона и устройством Bluetooth.

И иногда это работает странно, например, когда я выключаю Bluetooth, соответствующий маршрут кажется удаленным (воспроизведение переключается на динамик), но мое приложение не получает никакого обратного вызова. И более того, когда я вручную получаю все маршруты через MediaRouter.getRoutes(), он возвращает этот маршрут Bluetooth, но когда я пытаюсь переключиться на него, он кажется выбранным, но на самом деле воспроизведение все еще проходит через динамик.

Я пробовал все флаги CALLBACK_FLAG_FORCE_DISCOVERY, CALLBACK_FLAG_REQUEST_DISCOVERY и т.д., без результата. Помогает только перезагрузка телефона. Любые предложения?

Я использовал Android 4.2, 4.4.

UPDATE, пример кода: ....

private MediaRouter mMediaRouter;

    private MediaRouter.Callback mMediaRouterCallback = new MediaRouter.Callback(){
        @Override
        public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo route) {
            super.onRouteAdded(router, route);
            refreshRoutes();
            Log.i(TAG, "Route added ==> " + route.getName());
        }

        @Override
        public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo route) {
            super.onRouteRemoved(router, route);
            refreshRoutes();
            Log.i(TAG, "Route removed ==> " + route.getName());
        }

        @Override
        public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
            super.onRouteSelected(router, route);
            Log.i(TAG, "Route selected ==> " + route.getName());
            refreshRoutes();
        }

        @Override
        public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) {
            super.onRouteUnselected(router, route);
            Log.i(TAG, "Route UNselected ==> " + route.getName());
            refreshRoutes();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRoutesList = (ListView) findViewById(R.id.routesList);

        mRoutesList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String routeName = mRoutesAdapter.getItem(i);

                List<MediaRouter.RouteInfo> routes = mMediaRouter.getRoutes();
                for (MediaRouter.RouteInfo rout : routes){
                    if (rout.getName().equals(routeName)){
                        mMediaRouter.selectRoute(rout);
                    }
                }
            }
        });

        mMediaRouter = MediaRouter.getInstance(this);
        mMediaRouter.addCallback(
                new MediaRouteSelector.Builder()
                        .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
                        .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
                        .build(),
                mMediaRouterCallback,
                MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);

        mRoutesAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 0);
        mRoutesList.setAdapter(mRoutesAdapter);

        refreshUi();
    }

@Override
    protected void onDestroy() {
        mMediaRouter.removeCallback(mMediaRouterCallback);
        super.onDestroy();
    }

private void refreshRoutes(){
        mRoutesAdapter.clear();
        MediaRouter.RouteInfo selectedRoute = mMediaRouter.getSelectedRoute();
        List<MediaRouter.RouteInfo> routes = mMediaRouter.getRoutes();
        for (MediaRouter.RouteInfo rout : routes){
            if (rout == selectedRoute)
                mRoutesAdapter.add(rout.getName() + " [selected]");
            else
                mRoutesAdapter.add(rout.getName());
        }
        mRoutesAdapter.notifyDataSetChanged();
    }

Ответы

Ответ 1

Используя предложение @Xaver в комментариях к вопросу, я поместил все MediaRouting в службу. У меня все работает, как было до службы, но такая же ошибка. Когда я вернулся к активности, после одного переключения с проводного на динамик BlueTooth, MediaRouter застрял бы на проводном динамике, несмотря на то, что он сказал, что текущий маршрут - это громкоговоритель Bluetooth.

Переключение с android.support.v7.media.MediaRouter на android.media.MediaRouter и рефакторинг моего кода немного сработало отлично. Трудно сказать, что перемещение маршрутизации на службу было частью комбинации, но я получил ее работу (после ~ 50 часов возиться со всем)

Несчастная вещь с android.media.MediaRouter заключается в том, что у нее нет метода getRoutes, но ничто из того, что Googleing не смог обработать! Поскольку мне было больно понять это из документов, поскольку все ссылается на библиотеку v7, ниже показано, как получить MediaRouter и выбрать маршрут.

MediaRouter mr = (MediaRouter)this.getSystemService(this.MEDIA_ROUTER_SERVICE);
mr.selectRoute(mr.ROUTE_TYPE_LIVE_AUDIO, mr.getRouteAt(0));

Надеюсь, это поможет кому-то!