2016-01-13 11 views
10

मैं है अजीब मुद्दा है, मैं chromecast के लिए mediaprovider बनाने हूँ निम्नलिखित कोड है कि पहले उदाहरण के लिए ठीक काम करता है का उपयोग कर, उपकरणों की सूची में दिखाया गया है और एक बार slected मैं router.selectRoute(routeinfo); का उपयोग, लेकिन एक बार मैं एप्लिकेशन को इस कोड Chromecast डिवाइस को खोजने में असमर्थ से बाहर निकलें , जब मैं ऐप को चलाने वाले ऐप से ऐप हटाता हूं तो यह कोड फिर से ठीक काम करता है और डिवाइस दिखाता है।Chromecast MediaRouteProviderService

कोई डिवाइस का चयन किया जाता है और एप्लिकेशन तो प्रेस वापस का उपयोग कर बाहर निकल गया है, तो भी इस कोड को ठीक काम करता है

तो क्या मैं गलत यहाँ कर रहा हूँ? मुझे लगता है कि संसाधनों को साफ़ नहीं किया जाता है जब मेरा ऐप सरल वापस दबाया जाता है।

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)) ; 
     } 

    } 
} 

}

उत्तर

2

ठीक है अंत में मैं अपने दम पर इस सवाल का जवाब मिल गया है,

समस्या जब किसी अन्य सेवा प्रदाता का चयन किया जाता onRouteAdded क्यों का उपयोग कर इसे न जोड़ लिया है? मैं वास्तव में न गूगल तर्क

तो समाधान unselect को रूटर है जब आप चाहते हैं या बेहतर का चयन डिफ़ॉल्ट मार्ग जब इतना है कि अपने मार्ग में 10 बार से बाहर

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

लेकिन फिर 1 जारी किया गया है समझते हैं कि यह होगा काम नहीं

आशा किसी की मदद करेगा

संबंधित मुद्दे

 संबंधित मुद्दे