4

Chromecast と ActionbarSherlock の両方をサポートするアプリケーションを開発しています。
すべてのアクティビティで、ActionBar に MediaRouteButton を作成します。

私の問題は、最初のアクティビティで Chromecast デバイスに接続せず、2 番目のアクティビティに移動することです。2 つ目では、Chromecast デバイスに接続します。onRouteSelected()2 番目のアクティビティの に実行され、次に最初のアクティビティのonDeviceAvailable()->openSession()に実行されました。2 番目のアクティビティで
実行されなかった理由はわかりません。 誰でも私を助けることができますか?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);
        .....
  }
4

2 に答える 2

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);
    }
    ...
}
于 2013-11-02T05:18:04.880 に答える
1

私はここで問題を見つけました:
MediaRouteHelper.registerMinimalMediaRouteProvider( mCastContext, this );2 番目のアクティビティで false を返します。最初のアクティビティに登録済みだからです。

私は一時的な解決策を考えています:

  @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 のすべての状態を解放するためです。

誰かがアイデアを助けますか?

于 2013-11-01T08:29:43.947 に答える