SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback() {
public void surfaceChanged(SurfaceHolder holder, int format,
int w, int h) {
mSurfaceWidth = w;
mSurfaceHeight = h;
boolean isValidState = (mTargetState == STATE_PLAYING);
boolean hasValidSize = (mVideoWidth == w && mVideoHeight == h);
if (mMediaPlayer != null && isValidState && hasValidSize) {
if (mSeekWhenPrepared != 0) {
seekTo(mSeekWhenPrepared);
}
start();
}
}
public void surfaceCreated(SurfaceHolder holder) {
mSurfaceHolder = holder;
if (null != mMediaPlayer) {
mMediaPlayer.setDisplay(holder);
mMediaPlayer.seekTo(mSeekWhenPrepared);
} else {
openVideo();
}
enableOrientationDetect();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// after we return from this we can't use the surface any more
mSeekWhenPrepared = getCurrentPosition();
if (mMediaController != null) mMediaController.hide();
if (null != mMediaPlayer) {
mMediaPlayer.setDisplay(null);
mMediaPlayer.pause();
}
disableOrientationDetect();
}
};
1,SurfaceHolder.Callback的对显示view的管理。切换后台或者打开其他二级页面的时候,系统会销毁显示画面的view。这时setDisplay(null)防止不必要的error回调,mediaplayer.pause防止正在缓冲过程中,surfaceDestroyed回调,没画面有声音。
2,首次加载视频资源的时候,因为prepareAsync是不可取消的,调release是没用的。防止在prepare过程中切到后台然后缓冲好的时候直接播放了,应该做好pause
3,infolistener中的回调缓冲start和end会短暂循环调用,如果在这里做加载中进度动画开始和暂停会频闪,首次加载的话可以在第一帧回调里再停止缓冲动画
以上是基于UniversalVideoView的基础完善,测试基本可以商用,吐槽下这个开源控件的坑太多了,似乎是刚写出来的。
附上改的两个类,基本无bug流程运行