Поддержка 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(); } 

Solutions Collecting From Web of "Поддержка Android v7 MediaRouter иногда не работает должным образом"

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

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

getRoutes дело с 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)); 

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