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) {
}
}
本文探讨了MediaPlayer在设置循环播放后不触发onCompletion回调的问题,并提供了详细的伪代码示例,展示了如何正确处理视频播放结束后的逻辑,包括下一视频的自动播放。
1438

被折叠的 条评论
为什么被折叠?



