2016-01-13 10 views
10

私は奇妙な問題があります。最初のインスタンスで正常に動作する次のコードを使用して、私が使用しているコードを使用してmediaproviderを作成しています。どのようにアプリケーションを実行してからアプリケーションを削除すると、このコードがうまく動作し、デバイスが表示されるのか。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

okが最終的に私は、プロバイダーが選択されている場合

問題は、それがonRouteAdded理由を使用して追加いないで、自分で答えを見つけましたか?あなたのルートが

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

しかし、再び、それは意志10回のうち1を放出されるようにするとき、私は本当にあなたが選択するデフォルトルートをしたいか、より良いときに解決策がunselectにルータであるGoogleのロジックに

を理解しません役に立たない

希望は誰かを助けるでしょう

関連する問題