2015-01-30 2 views
14

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

И иногда это работает странно, например, когда я выключаю 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(); 
    } 
+0

Можем ли мы увидеть какой-либо код, пожалуйста. –

+0

см. Обновление – Denisigo

+0

@Iocrizak Итак, вы делаете всю работу над MediaRouter в «Деятельности»? Сделайте это на переднем плане «Сервис», и я предполагаю, что все ваши проблемы исчезнут ... –

ответ

2

Использование @ предложение 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));

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

Смежные вопросы