【问题标题】:IllegalStateException when returning to Activity containing MediaPlayer返回包含 MediaPlayer 的 Activity 时出现 IllegalStateException
【发布时间】:2014-11-13 15:21:32
【问题描述】:

我有一个带有 MediaPlayer 的 Activity,每当我从它启动另一个 Activity(例如 Chromecast 控制器 Activity 或使用 ShareActionProvider)并返回带有 MediaPlayer 的 Activity 时,我都会收到以下 IllegalStateException:

11-13 15:48:33.083  22342-22342/com.iosharp.android.ssplayer E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.IllegalStateException
            at android.media.MediaPlayer._setVideoSurface(Native Method)
            at android.media.MediaPlayer.setDisplay(MediaPlayer.java:733)
            at com.iosharp.android.ssplayer.videoplayer.VideoActivity.surfaceCreated(VideoActivity.java:126)
            at android.view.SurfaceView.updateWindow(SurfaceView.java:610)
            at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:239)
            at android.view.View.dispatchWindowVisibilityChanged(View.java:8170)

阅读文档说 setDisplay() 可以在任何状态下调用。

我的相关代码如下:

public class VideoActivity extends ActionBarActivity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener,
        VideoControllerView.MediaPlayerControl, MediaPlayer.OnErrorListener {



    private SurfaceView mSurfaceView;
    private MediaPlayer mPlayer;
    private VideoControllerView mController;
    private String mURL;
    private SurfaceHolder mSurfaceHolder;
    private VideoCastManager mCastManager;
    private MediaInfo mSelectedMedia;
    private IVideoCastConsumer mVideoCastConsumer;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mCastManager = CastApplication.getCastManager(this);
        setContentView(R.layout.activity_video);

        mSurfaceView = (SurfaceView) findViewById(R.id.videoSurface);

        setupActionBar();
        setupCastListeners();

        Bundle b = getIntent().getExtras();
        if (b != null) {
            mSelectedMedia = Utils.toMediaInfo(getIntent().getBundleExtra("media"));
            mURL = mSelectedMedia.getContentId();

            mSurfaceHolder = mSurfaceView.getHolder();
            mSurfaceHolder.addCallback(this);
            mPlayer = new MediaPlayer();
            mController = new VideoControllerView(this, false);
        }
    }


    @Override
    protected void onResume() {
        super.onResume();
        setupLocalPlayback();

        if (mCastManager != null) {
            mCastManager.incrementUiCounter();
        }
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mController.show();
        showActionBar();
        return false;
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        // Hide to prevent illegal state exception of getCurrentPosition
        mController.hide();
        if (mPlayer != null) {
            mPlayer.reset();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        mController.hide();
        mPlayer.release();

        if (mCastManager != null) {
            mCastManager.decrementUiCounter();
        }
    }

【问题讨论】:

    标签: android android-mediaplayer surfaceview surfaceholder


    【解决方案1】:

    好吧,你做 mPlayer.release();在 onPause() 方法中,所以 mPlayer 被释放,你不能对他做任何事情。尝试重新启动它或不要在 onPause 中释放。例如,尝试在 onStop 中执行此操作。

    【讨论】:

    • 为了获得所需的行为(返回播放器时基本上不会出现 IllegalStateException),我将 onPause() 中的 mPlayer.release() 替换为 mPlayer.reset()
    【解决方案2】:

    mSurfaceHolder = mSurfaceView.getHolder();
    mSurfaceHolder.addCallback(this);
    mPlayer = new MediaPlayer();
    mController = new VideoControllerView(this, false);
    

    在 bundle.getExtras() 上方检查类似

    mSurfaceHolder = mSurfaceView.getHolder();
    mSurfaceHolder.addCallback(this);
    mPlayer = new MediaPlayer();
    mController = new VideoControllerView(this, false);
    
    Bundle b = getIntent().getExtras();
            if (b != null) {
                mSelectedMedia = Utils.toMediaInfo(getIntent().getBundleExtra("media"));
                mURL = mSelectedMedia.getContentId();
            }
    

    确保它始终被初始化

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2017-01-02
      相关资源
      最近更新 更多