2013-11-01 2 views
4

Chromecast와 ActionbarSherlock을 모두 지원하는 애플리케이션을 개발 중입니다.
모든 활동에서 ActionBar에 MediaRouteButton을 만듭니다.여러 활동이있는 Chromecast

제 문제는 첫 번째 활동에서 Chromecast 기기에 연결하지 않고 두 번째 활동으로 이동한다는 것입니다. 두 번째로는 Chromecast 기기에 연결합니다. 그것은 두 번째 활동의 onRouteSelected()에 들어갔다가 첫 번째 활동의 onDeviceAvailable() ->openSession()으로 뛰었다.
왜 두 번째 활동에서 onDeviceAvailable()이 실행되지 않았는지 알 수 없습니다.
아무도 도와 줄 수 있습니까?
MediaRouteHelper.registerMinimalMediaRouteProvider(mCastContext, this); 두 번째 활동에서 false를 반환합니다 :

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_cast_sample); 

    mMetaData = new ContentMetadata();  


    mMediaSelectionDialog = new MediaSelectionDialog(this); 
    mCastContext = new CastContext(getApplicationContext()); 
    MediaRouteHelper.registerMinimalMediaRouteProvider(mCastContext, this); 
    mMediaRouter = MediaRouter.getInstance(getApplicationContext()); 
    mMediaRouteSelector = MediaRouteHelper.buildMediaRouteSelector(MediaRouteHelper.CATEGORY_CAST); 
    mMediaRouterCallback = new MyMediaRouterCallback(); 
} 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // TODO Auto-generated method stub 
     getSupportMenuInflater().inflate(R.menu.cast_sample, menu); 
     com.actionbarsherlock.view.MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item); 
     mMediaRouteButton = (MediaRouteButton) mediaRouteMenuItem.getActionView(); 
     mMediaRouteButton.setRouteSelector(mMediaRouteSelector); 
     return true; 
    } 


    @Override 
    protected void onStart() { 
     super.onStart(); 
     mMediaRouter.addCallback(mMediaRouteSelector, mMediaRouterCallback, 
       MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);  
    } 



    @Override 
    protected void onStop() { 
     mMediaRouter.removeCallback(mMediaRouterCallback); 
     super.onStop();   
    } 

    private class MyMediaRouterCallback extends MediaRouter.Callback { 
     @Override 
     public void onRouteSelected(MediaRouter router, RouteInfo route) { 
      MediaRouteHelper.requestCastDeviceForRoute(route); 
     } 

     @Override 
     public void onRouteUnselected(MediaRouter router, RouteInfo route) { 
      try { 
       if (mSession != null) { 
        logVIfEnabled(TAG, "Ending session and stopping application"); 
        mSession.setStopApplicationWhenEnding(true); 
        mSession.endSession(); 
       } else { 
        Log.e(TAG, "onRouteUnselected: mSession is null"); 
       } 
      } catch (IllegalStateException e) { 
       Log.e(TAG, "onRouteUnselected:"); 
       e.printStackTrace(); 
      } catch (IOException e) { 
       Log.e(TAG, "onRouteUnselected:"); 
       e.printStackTrace(); 
      } 
      mMessageStream = null; 
      mSelectedDevice = null; 
     } 
    } 


    @Override 
    public void onDeviceAvailable(CastDevice device, String myString, 
     MediaRouteStateChangeListener listener) { 
     mSelectedDevice = device; 
     logVIfEnabled(TAG, "Available device found: " + myString); 
     openSession(); 
    } 
    private void openSession() { 
     mSession = new ApplicationSession(mCastContext, mSelectedDevice); 
     ..... 
    } 

답변

1

내가 여기에 문제를 발견

사전

에서

덕분에 여기에서 모두 활동에 내 코드입니다. 이미 첫 번째 활동에 등록했기 때문입니다. 나는 등록을 취소 할 때, 나는 다시 Chromecast 기기에 연결해야

@Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     MediaRouteHelper.registerMinimalMediaRouteProvider(mCastContext, this); 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     MediaRouteHelper.unregisterMediaRouteProvider(mCastContext); 
    } 

그러나 :

난 그냥 임시 해결책을 생각합니다. 왜냐하면 CastContext의 모든 상태를 해제하기 때문입니다.

누구에게도 도움이됩니까?

10

나는 MediaRouteAdapter를 구현하는 별도의 ChromecastAdapter Singleton 클래스를 작성했습니다. 생성시 registerMinimalMediaRouteProvider를 호출하고 절대 등록을 취소하지 않습니다. ChromecastAdapter에 모든 Chromecast 상태가 포함됩니다. 각 액티비티에서해야 할 일은 MediaRouteButton을 전달하고 그것에 setRouteSelector를 호출하는 것입니다.

public class ChromeCastAdapter implements MediaRouteAdapter { 

    ... 
    private static ChromeCastAdapter instance = null; 

    public static ChromeCastAdapter getInstance(Context activity) { 
     if (instance == null) { 
      instance = new ChromeCastAdapter(activity); 
     } 
     return instance; 
    } 

    private ChromeCastAdapter(Context activity) { 
     this.context = activity.getApplicationContext(); 

     castContext = new CastContext(context); 
     mediaRouter = MediaRouter.getInstance(context); 

     MediaRouteHelper.registerMinimalMediaRouteProvider(castContext, this); 

     mediaRouteSelector = MediaRouteHelper.buildMediaRouteSelector(MediaRouteHelper.CATEGORY_CAST); 

     mediaRouterCallback = new MediaRouterCallback(); 
     mediaRouter.addCallback(mediaRouteSelector, mediaRouterCallback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); 
    } 

    public void setMediaRouteButtonSelector(MediaRouteButton mediaRouteButton) { 
     mediaRouteButton.setRouteSelector(mediaRouteSelector); 
    } 
    ... 
} 
+0

감사합니다 –

+0

이 여전히 유효합니까? 지금까지 찾은이 주제에 관한 유망한 자료와 유일한 자료입니다. – sschrass

+0

당시 개인 SDK로 작업하고있었습니다. 2014 년 2 월에 출시 된 공개 SDK는 평가하지 않았지만 Google이이를 쉽게 만든다면 놀라지 않을 것입니다. – ActiveApathy

관련 문제