2013-11-01 5 views
4

Я разрабатываю приложение, поддерживающее как Chromecast, так и ActionbarSherlock.
В каждом действии я создаю MediaRouteButton в ActionBar.Chromecast с несколькими действиями

Моя проблема: я не подключался к устройству Chromecast в первом действии и перешел ко второму действию. Во втором я подключился к устройству Chromecast. Он запустился в onRouteSelected() второй активности, затем запустился в onDeviceAvailable() ->openSession() первого действия.
Не знаю, почему он не натолкнулся на onDeviceAvailable() на вторую активность.
Может ли кто-нибудь мне помочь?

Заранее спасибо

Вот мой код в обоих мероприятиях:

@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

Я нашел этот вопрос здесь:
MediaRouteHelper.registerMinimalMediaRouteProvider(mCastContext, this); будет возвращать ложь во второй деятельности. Потому что я уже зарегистрировал его в первом мероприятии.

Я просто думаю, что временное решение, которое:

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

Но когда я разрегистрировать, я должен подключиться к устройству Chromecast снова. Потому что он освободит все состояние CastContext.

Помогает ли кто-нибудь?

10

Я написал отдельный класс Singleton ChromecastAdapter, который реализует MediaRouteAdapter. Я вызываю 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. Я не оценил публичный SDK, который был выпущен в феврале 2014 года, но я не удивлюсь, если Google сделает это проще. – ActiveApathy

Смежные вопросы