android 有三种视频播放方式
1 surfaceView + MediaPlayer 组合
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play_activity);
seekBarVideo =(SeekBar)findViewById(R.id.seekBar_video);
mediaPlayer = new MediaPlayer();
pathString = "https://video.c-ctrip.com/videos/u00b0c00000065uyyBF17.mp4";
holder = surfaceView.getHolder();
holder.addCallback(this);
try {
mediaPlayer.setDataSource(pathString);
mediaPlayer.prepare();
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
mediaPlayer.start();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mediaPlayer.setDisplay(holder);
int max=mediaPlayer.getDuration();
seekBarVideo.setMax(max);
//定时器更新进度条
timer=new Timer();
timeTask=new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
seekBarVideo.setProgress(mediaPlayer.getCurrentPosition());
}
};
timer.schedule(timeTask, 0, 500);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {
currentPosition=mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer=null;
timer.cancel();
timeTask.cancel();
timer=null;
timeTask=null;
}
}
在这里容易出现问题
mediaPlayer.setDisplay(holder);
容易报 SurfaceHolder holder can not release
问题出现在mdiaPlayer 中没有初始化好,所以我门会实现 SurfaceHolder 中的CallBack 接口
在
public void surfaceCreated(SurfaceHolder holder) {}
中设置 mediaPlayer.setDisplay(holder);
在播放视频的时候,我们经常会把视频切换到后台,这时候会回调
@Override
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
所以我们在切到后台,然后切换到前台的时候,SurfaceView 会需要重新创建,所以 创建surfaceView 的实例最好放在onResume 中去。