【发布时间】: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