[AndroidStudio] Solution for VideoView or MediaPlayer black screen after locking screen or switching interface

The original link is as follows:

https://blog.csdn.net/Rookie_or_beginner/article/details/115129648 icon-default.png?t=M5H6https://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;
        }
    }

Guess you like

Origin blog.csdn.net/qq_36251561/article/details/125499747