mediaPlayer播放完成后不走回调,检查下是否设置了mediaPlayer.setLooping(true);
设置循环播放就不会走onCompletion
回调。
下面是我的伪代码
private void playVideo() {
//如果不为空释放在new
if (mediaPlayer != null) {
mediaPlayer.reset();
}
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(getContext(), Uri.parse(videoUrl));
if (mSurfaceView.getVisibility() == View.GONE)
mSurfaceView.setVisibility(View.VISIBLE);
SurfaceHolder holder = mSurfaceView.getHolder();
holder.addCallback(new MyCallBack());
mediaPlayer.prepare();
//准备完成监听
mediaPlayer.setOnPreparedListener(onPreparedListener);
mediaPlayer.setOnCompletionListener(onCompletionListener);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 准备完成
*/
MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// mediaPlayer.setLooping(true);//循环播放
mp.start();
}
};
MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
XLogUtils.e("播放完成");
mSurfaceView.setVisibility(View.GONE);
if (currentVideoIndex == videoUrls.size() - 1) return;
currentVideoIndex++;
videoUrl = videoUrls.get(currentVideoIndex);
XLogUtils.d("播放下一个");
playVideo();
}
};
/**
*
*/
private class MyCallBack implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (mediaPlayer != null)
mediaPlayer.setDisplay(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}