videoview使用的坑

项目里的app里的视频播放是用videoview实现的,最初的播放流程为

// 当MediaPlayer准备好后触发该回调
    private MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                @Override
                public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
                        //去把你的 加载中的loading界面去掉
                        return true;
                    }
                    return false;
                }
            });

        }
    };

但是某些手机系统中(我遇到有三星的机型), onInfoListener的回调时间会不确定晚了很久。将代码优化为
 
  
 
  
    // 当MediaPlayer准备好后触发该回调
    private MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            if (!mediaPlayer.isPlaying()) {
                mediaPlayer.start();
                //去把你的 加载中的loading界面去掉
            } else
                mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                    @Override
                    public boolean onInfo(MediaPlayer mp, int what, int extra) {
                        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
                            //去把你的 加载中的loading界面去掉
                            return true;
                        }
                        return false;
                    }
                });

        }
    };
 
  
另一个bug,是videoview在暂停了播放后,跳出所在的activity,再次进入时,videoview就黑屏了。 
  
经过网上的搜索:http://www.eoeandroid.com/thread-546295-1-1.html?_dsign=f204c33c
 
  
VideoView自身的加载机制就是这样的,每次都会重新加载。
如果你播放的是本地视频,那么这个问题容易解决:
你要在按下home键后保存你当前播放的帧到intent中,然后再重新可见的时候通过调用seekTo方法跳到你之前保存的帧那里,同时调用pause()方法暂停播放,就可以达到你的效果。
但是如果你播放的是网络视频的话,你就需要在视频缓冲准备的时候给予一个背景(视频正在缓冲中。。。),等加载完毕后再执行刚才的流程。
说的应该很明白了吧
 
  
经过启发之后 是说要在activity的 onPause的生命周期中把videoview暂停掉,然后记录videoview的播放进度,代码修改为
 
  
 
  
    // 当MediaPlayer准备好后触发该回调
    private MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            if (!mediaPlayer.isPlaying()) {
                if (mSeekPosition != 0) {
                    mediaPlayer.seekTo(mSeekPosition);
                    mediaPlayer.start();
                    mediaPlayer.pause();
                    return;
                }
                mediaPlayer.start();
                //去把你的 加载中的loading界面去掉
            } else
                mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                    @Override
                    public boolean onInfo(MediaPlayer mp, int what, int extra) {
                        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
                            if (mSeekPosition != 0) {
                                mp.seekTo(mSeekPosition);
                                mp.start();
                                mp.pause();
                                return true;
                            }
                            //去把你的 加载中的loading界面去掉
                            return true;
                        }
                        return false;
                    }
                });

        }
    };
mSeekPosition 为int类型,在onPause时记录的播放进度。
方可解决在退出activity,再进入时videoview黑屏的问题。


 
  

你可能感兴趣的:(videoview使用的坑)