美文网首页
[Android]播放视屏,Activity失去焦点在获取焦点不

[Android]播放视屏,Activity失去焦点在获取焦点不

作者: 黑森林中的小木屋 | 来源:发表于2018-05-08 18:33 被阅读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方法
    

    相关文章

      网友评论

          本文标题:[Android]播放视屏,Activity失去焦点在获取焦点不

          本文链接:https://www.haomeiwen.com/subject/opmwrftx.html