2016-01-13 14 views
10

Ho un problema strano, sto creando mediaprovider per chromecast utilizzando il seguente codice che funziona bene per la prima istanza, l'elenco dei dispositivi viene mostrato e una volta inserito utilizzo router.selectRoute(routeinfo); ma una volta uscito dall'app questo codice non riesce a trovare il dispositivo Chromecast , come mai quando rimuovo l'app dalle app in esecuzione, questo codice funziona ancora e mostra i dispositivi.Chromecast MediaRouteProviderService

Se non è selezionato alcun dispositivo e applicazione si esce usando retro stampa poi anche questo codice funziona bene

Quindi quello che sto facendo male qui? quello che penso è che le risorse non vengono cancellate quando la mia app esce in semplice back press.

public class ChromecastRouteProviderService extends MediaRouteProviderService { 
final String LOGTAG = "Chromecast"; 
private static final String CONTROL_CATEGORY = CastMediaControlIntent.categoryForCast(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID); 
private static final MediaRouteSelector SELECTOR = new MediaRouteSelector.Builder().addControlCategory(CONTROL_CATEGORY) 
     .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK).build(); 
private IntentFilter controlFilter; 

public ChromecastRouteProviderService() { 
    controlFilter = new IntentFilter(); 
} 

public void onCreate() { 
    super.onCreate(); 
    controlFilter.addCategory(IAppConstants.CATEGORY); 
    controlFilter.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK); 
} 

@Override 
public MediaRouteProvider onCreateMediaRouteProvider() { 
    return new ChromecastRouteProvider(this); 
} 

class ChromecastRouteProvider extends MediaRouteProvider { 
    MediaRouter.Callback callback; 
    Hashtable routes; 

    public ChromecastRouteProvider(Context context) { 
     super(context); 
     routes = new Hashtable(); 
     callback = new CastCallBack(); 
    } 

    @Nullable 
    @Override 
    public RouteController onCreateRouteController(String routeId) { 
     MediaRouter.RouteInfo routeInfo = (MediaRouter.RouteInfo) routes.get(routeId); 
     if (routeInfo == null) { 
      return super.onCreateRouteController(routeId); 
     } else { 
      return new ChromecastRouteController(getContext(), routeInfo); 
     } 
    } 

    @Override 
    public void onDiscoveryRequestChanged(@Nullable MediaRouteDiscoveryRequest request) { 
     super.onDiscoveryRequestChanged(request); 
     if (request == null || !request.isActiveScan() || !request.isValid()) { 
      stopScan(); 
      return; 
     } 
     if (!request.getSelector().hasControlCategory(IAppConstants.CATEGORY)) { 
      Log.i(LOGTAG, "Not scanning for non remote playback"); 
      stopScan(); 
      return; 
     } else { 
      Log.i(LOGTAG, "Scanning..."); 
      mediarouter.addCallback(ChromecastRouteProviderService.SELECTOR, callback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); 
      return; 
     } 
    } 

    void updateDescriptor() { 
     final MediaRouteProviderDescriptor.Builder descriptor = new MediaRouteProviderDescriptor.Builder(); 
     for (Iterator iterator = routes.values().iterator(); iterator.hasNext();) { 
      MediaRouter.RouteInfo routeinfo = (MediaRouter.RouteInfo) iterator.next(); 
      try { 
       Bundle bundle = new Bundle(); 
       bundle.putBoolean("has_upsell", true); 
       descriptor.addRoute(new MediaRouteDescriptor.Builder(routeinfo.getId(), routeinfo.getName()) 
         .addControlFilter(controlFilter).setPlaybackStream(3) 
         .setDescription(routeinfo.getDescription()) 
         .setEnabled(true).setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE) 
         .setVolumeHandling(1).setVolumeMax(100).setVolume(100) 
         .setExtras(bundle).build()); 
      } catch (Exception e) { 
       throw new Error("wtf"); 
      } 
     } 

     getHandler().post(new Runnable() { 
      @Override 
      public void run() { 
       setDescriptor(descriptor.build()); 
      } 
     }); 

    } 

    void stopScan() { 
     Log.i(LOGTAG, "Stopping scan..."); 
     try { 
      MediaRouter.getInstance(getContext()).removeCallback(callback); 
      return; 
     } catch (Exception exception) { 
      return; 
     } 
    } 

    class CastCallBack extends MediaRouter.Callback { 
     void check(MediaRouter mediarouter, MediaRouter.RouteInfo routeinfo) { 
      Log.i(LOGTAG, new StringBuilder().append("Checking route ").append 
        (routeinfo.getName()).toString()); 
      CastDevice device = CastDevice.getFromBundle(routeinfo.getExtras()); 
      if (routeinfo.matchesSelector(ChromecastRouteProviderService.SELECTOR) 
        && device != null && device.isOnLocalNetwork()) { 
       routes.put(routeinfo.getId(), routeinfo); 
       updateDescriptor(); 
       return; 
      } else { 
       return; 
      } 
     } 

     public void onRouteAdded(MediaRouter mediarouter, MediaRouter.RouteInfo routeinfo) { 
      super.onRouteAdded(mediarouter, routeinfo); 
      check(mediarouter, routeinfo); 
     } 

     public void onRouteChanged(MediaRouter mediarouter, MediaRouter.RouteInfo routeinfo) { 
      super.onRouteChanged(mediarouter, routeinfo); 
      check(mediarouter, routeinfo); 
     } 

     public void onRouteRemoved(MediaRouter mediarouter, MediaRouter.RouteInfo routeinfo) { 
      super.onRouteRemoved(mediarouter, routeinfo); 
      if (routeinfo.matchesSelector(ChromecastRouteProviderService.SELECTOR)) ; 
     } 

    } 
} 

}

risposta

2

Ok finalmente ho trovato la risposta da solo,

problema è quando si seleziona qualsiasi provider non è aggiunto utilizzando onRouteAdded perché? I dont davvero capire google logica

Quindi la soluzione è quella di unselect il router quando si vuole o meglio selezionare percorso di default, quando in modo che il percorso viene rilasciato

MediaRouter.getInstance(this).getDefaultRoute().select(); 

Ma ancora una volta 1 su 10 volte lo farà non funziona

Hope aiuterà qualcuno

Problemi correlati