【问题标题】:MediaPlayer IllegalStateException in AndroidAndroid 中的 MediaPlayer IllegalStateException
【发布时间】:2017-01-02 20:18:53
【问题描述】:

我有 SurfaceView,我从 sdcard 播放视频。视频结束后,我尝试显示图像 5 秒,然后再次播放我的视频。当我运行我的应用程序并且视频完成时,我有 IllegalStateException

 videoSurface = (SurfaceView) findViewById(R.id.videoSurface);
    videoHolder = videoSurface.getHolder();
    videoHolder.addCallback(this);

    player = new MediaPlayer();
    controller = new VideoControllerView(this);
    player.setOnPreparedListener(this);


    try {
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        String filePath = Environment.getExternalStorageDirectory() + "/myvideo/Sample.mp4";
        player.setDataSource(filePath);
        player.setOnPreparedListener(this);

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                videoSurface.setVisibility(View.INVISIBLE);
                findViewById(R.id.imageView).setVisibility(View.VISIBLE);
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                findViewById(R.id.imageView).setVisibility(View.INVISIBLE);
                                videoSurface.setVisibility(View.VISIBLE);

                            }
                        });
                        player.start();

                    }
                }, 5000);

            }
        });
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}



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

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    player.setDisplay(holder);
    player.prepareAsync();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}
@Override
public void onPrepared(MediaPlayer mp) {
    controller.setMediaPlayer(this);
    controller.setAnchorView((RelativeLayout) findViewById(R.id.videoSurfaceContainer));
    player.start();
}

@Override
public boolean canPause() {
    return true;
}

@Override
public boolean canSeekBackward() {
    return true;
}

@Override
public boolean canSeekForward() {
    return true;
}

@Override
public int getBufferPercentage() {
    return 0;
}

@Override
public int getCurrentPosition() {
    return player.getCurrentPosition();
}

@Override
public int getDuration() {
    return player.getDuration();
}

@Override
public boolean isPlaying() {
    return player.isPlaying();
}

@Override
public void pause() {
    player.pause();
}

@Override
public void seekTo(int i) {
    player.seekTo(i);
}

@Override
public void start() {
    player.start();
}

@Override
public boolean isFullScreen() {
    return false;
}

@Override
public void toggleFullScreen() {

}

可能问题出在这一行

videoSurface.setVisibility(View.VISIBLE);

我的代码做错了什么?

【问题讨论】:

  • 发布您的 logcat 错误日志
  • 如果在 onCompletionListener 中注释掉改变表面可见性(两次)怎么办?我相信可见性的变化会触发一些回调(例如 onSurfaceChanged),从而使玩家处于无效状态。

标签: android android-mediaplayer surfaceview illegalstateexception


【解决方案1】:

onComplation 之前尝试player.release() player.start()

【讨论】:

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