项目里的app里的视频播放是用videoview实现的,最初的播放流程为
<pre style="font-family: Consolas; font-size: 11.3pt; background-color: rgb(255, 255, 255);"><pre name="code" class="html">// 当MediaPlayer准备好后触发该回调
private MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
//去把你的 加载中的loading界面去掉
return true;
}
return false;
}
});
}
};
但是某些手机系统中(我遇到有三星的机型), onInfoListener的回调时间会不确定晚了很久。将代码优化为
// 当MediaPlayer准备好后触发该回调 private MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); //去把你的 加载中的loading界面去掉 } else mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) { //去把你的 加载中的loading界面去掉 return true; } return false; } }); } };
另一个bug,是videoview在暂停了播放后,跳出所在的activity,再次进入时,videoview就黑屏了。
经过网上的搜索:http://www.eoeandroid.com/thread-546295-1-1.html?_dsign=f204c33c
VideoView自身的加载机制就是这样的,每次都会重新加载。
如果你播放的是本地视频,那么这个问题容易解决:
你要在按下home键后保存你当前播放的帧到intent中,然后再重新可见的时候通过调用seekTo方法跳到你之前保存的帧那里,同时调用pause()方法暂停播放,就可以达到你的效果。
但是如果你播放的是网络视频的话,你就需要在视频缓冲准备的时候给予一个背景(视频正在缓冲中。。。),等加载完毕后再执行刚才的流程。
说的应该很明白了吧经过启发之后 是说要在activity的 onPause的生命周期中把videoview暂停掉,然后记录videoview的播放进度,代码修改为mSeekPosition 为int类型,在onPause时记录的播放进度。// 当MediaPlayer准备好后触发该回调 private MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { if (!mediaPlayer.isPlaying()) { if (mSeekPosition != 0) { mediaPlayer.seekTo(mSeekPosition); mediaPlayer.start(); mediaPlayer.pause(); return; } mediaPlayer.start(); //去把你的 加载中的loading界面去掉 } else mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) { if (mSeekPosition != 0) { mp.seekTo(mSeekPosition); mp.start(); mp.pause(); return true; } //去把你的 加载中的loading界面去掉 return true; } return false; } }); } };
方可解决在退出activity,再进入时videoview黑屏的问题。