The original link is as follows:
https://blog.csdn.net/Rookie_or_beginner/article/details/115129648 https://blog.csdn.net/Rookie_or_beginner/article/details/115129648 Simply put, the Activity is destroyed by the lock screen and interface switching SurfaceHolder during playback, after re-entering the program, no new SurfaceHolder is assigned to the player, resulting in no screen or black screen.
Rewrite the solution!
Use MediaPlayer+SurfaceView to replace the original VidwoView
Declare before Activity's onCreate
private String VideoPath="";//视频的路径,我使用的时raw下的
private SurfaceView videoView;//layout新加SurfaceView
private MediaPlayer videoPlayer;//要在SurfaceView里去创建Media
private boolean IsSurfaceDestoryed=false;//是否被销毁
Add a callback to SurfaceView in Activity's onCreate
videoView = (SurfaceView) findViewById(R.id.VideoSurfaceView);//id:VideoSurfaceView
videoView.getHolder().addCallback(new SurfaceViewCallback());//添加回调
//设置视频路径,直接播放raw文件夹下视频
VideoPath = "android.resource://" + getPackageName() + "/" + R.raw.back;
Add SurfaceViewCallback to the Activity class
//surface 回调
class SurfaceViewCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
{
if(videoPlayer==null) {
videoPlayer = new MediaPlayer();
try {
videoPlayer.setDataSource(MainActivity.this,Uri.parse(VideoPath));
} catch (IOException e) {
e.printStackTrace();
}
videoPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
videoPlayer.setLooping(true);
videoPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (!videoPlayer.isPlaying()) {
if (IsSurfaceDestoryed) {
IsSurfaceDestoryed = false;
}
videoPlayer.setDisplay(holder);
videoPlayer.start();
//循环播放
videoPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mPlayer) {
// TODO Auto-generated method stub
mPlayer.start();
mPlayer.setLooping(true);
}
});
}
}
});
videoPlayer.setDisplay(holder);
videoPlayer.prepareAsync();
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
///释放
IsSurfaceDestoryed = true;
videoPlayer.release();
videoPlayer=null;
}
}