[Android]播放视屏,Activity失去焦点在获取焦点不
2018-05-08 本文已影响0人
黑森林中的小木屋
我播放视屏采用的是MediaPlayer
+SurfaceView
1 解决办法:
在回调surfaceCreated
时重新执行mPlayar.setDisplay(surfaceHolder);
示例:
mHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
if(mPlayar == null){
play(); //第一次播放
}else if(!mPlayar.isPlaying()){ //继续播放
mPlayar.setDisplay(surfaceHolder);
mPlayar.start();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
});
2 具体原因分析
首先要知道:
在Activity失去焦点时,surfaceHolder
会回调surfaceDestroyed
被销毁掉,并在重新获取焦点时,再次创建,回调surfaceCreated
当失去焦点时,surfaceHolder
被销毁掉了,当重新获取焦点时不重新设置而直接执行mPlayar.start();
继续播放时,因为surfaceHolder
被销毁掉了所以会出现异常,这个时候只要重新设置一下就可以了
最后在附上MediaPlayer
+SurfaceView
视屏播放的代码
if(mPlayar == null){
mPlayar = new MediaPlayer();
}
if(mPlayar.isPlaying()){
return;
}
mPlayar.setDataSource(path); //设置播放路径
//播放完成回调
mPlayar.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.reset();
mediaPlayer.start(); //播放完毕后重新播放
}
});
//缓冲完成回调
mPlayar.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.setDisplay(mHolder); //在这里设置mHolder,一般情况下,缓冲完成了,mHolder也创建成功了,因为缓冲的时间肯定会大于代码执行的时间
mediaPlayer.start();
}
});
mPlayar.prepareAsync(); //开始异步缓冲,注意:异步缓冲才会回调onPrepared方法