2015-01-30 11 views
14

Używam biblioteki wsparcia V7 MediaRouter do przełączania tras między głośnikiem telefonu a urządzeniem bluetooth.Obsługa Android v7 MediaRouter czasami nie działa poprawnie

Czasami działa to dziwnie, na przykład, gdy wyłączam bluetooth, odpowiednia trasa wydaje się być usunięta (odtwarzanie przełącza się na głośnik), ale moja aplikacja nie otrzymuje żadnego oddzwaniania na ten temat. Co więcej, gdy ręcznie pobierane są wszystkie trasy za pośrednictwem MediaRouter.getRoutes(), zwraca tę trasę bluetooth, ale kiedy próbuję się na nią przełączać, wydaje się, że została wybrana, ale w rzeczywistości odtwarzanie nadal przechodzi przez głośnik.

Próbowałem wszystkie flagi CALLBACK_FLAG_FORCE_DISCOVERY, CALLBACK_FLAG_REQUEST_DISCOVERY itp., Bez wyniku. Działa tylko ponowne uruchomienie telefonu. Jakieś sugestie?

Użyłem Androida 4.2, 4.4.

UPDATE przykładowy kod: ....

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

Czy możemy zobaczyć jakiś kod, proszę. –

+0

zobacz aktualizację – Denisigo

+0

@Iocrizak Więc wykonujesz wszystkie prace dotyczące MediaRouter w "Activity"? Zrób to na pierwszym planie 'Service' i zgaduję, że wszystkie twoje problemy znikną ... –

Odpowiedz

2

Korzystanie @ sugestią Xaver w komentarzach pytanie, umieścić wszystkie MediaRouting w Serwisie. Mam wszystko działa jak przed usługą, ale ten sam błąd wystąpił. Kiedy wróciłem do działania, po jednym przełączeniu z przewodowego na głośnik BlueTooth, MediaRouter utknie na przewodowym głośniku, mimo że obecna trasa była głośnikiem Bluetooth.

Przełączanie z android.support.v7.media.MediaRouter na android.media.MediaRouter i refaktoryzacja mojego kodu wszystko działało idealnie. Trudno powiedzieć, czy przeniesienie trasy do usługi było częścią połączenia, ale sprawiło, że działało (po ~ 50 godzinach majsterkowania ze wszystkim)

Niefortunna rzecz z android.media.MediaRouter jest to, że nie ma ona metody getRoutes, ale nic, czego niewiele Googleing nie poradziłby sobie! Ponieważ stwierdziłem, że jest to trudny do zrozumienia tego z dokumentacji, ponieważ wszystko odnosi się do biblioteki v7, poniżej znajduje się, jak uzyskać MediaRouter i wybrać trasę.

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

Mam nadzieję, że to pomoże komuś!

Powiązane problemy