Android - VideoView,在播放视频时获取当前位置?

时间:2016-06-21 07:07:08

标签: android android-videoview

我有一个可以从内存中播放的VideoView。我的视频正在播放VideoView日志MediaPlayer: error (1, -1004)。我有一个onErrorListener附加到VideoView,我想在那里管理这个错误。我的目标是获取最后一个位置(来自getCurrentPosition())并使用seekTo(int position)从该位置再次启动我的玩家。我的视频文件有效(通过在其他玩家上播放进行验证)。我现在的问题是从VideoView获取最后一个有效位置。从onError调用getCurrentPosition()(MediaPlayer mp,int what,int extra)在我执行mp.getCurrentPosition / mVideoView.getCurrentPosition()时返回0(非常正确)。如何在播放时跟踪播放器的当前位置?

这是我的代码:

mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                switch (what) {
                    case MediaPlayer.MEDIA_ERROR_UNKNOWN:
                        Log.v("error", "media error unknown");
                        mediaErrorExtra(mp, extra, path);
                        break;
                    case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
                        Log.v("error", "media error server died");
                        mediaErrorExtra(mp, extra, path);
                        break;
                }
                return true;
            }
        });

private void mediaErrorExtra(MediaPlayer mp, int extra, String path){
        switch(extra){
            case MediaPlayer.MEDIA_ERROR_IO:

                if(!mp.isPlaying()){
                    Integer currentposition = mVideoView.getCurrentPosition();
                    if(currentposition != null){
                        Log.v("currentpos",Integer.toString(currentposition));
                    }
                    mVideoView.setVideoPath(path);
                    mVideoView.start();
                    //mVideoView.seekTo(currentposition);
                }
                break;
            case MediaPlayer.MEDIA_ERROR_MALFORMED:
                Log.v("error extra","media error malformed");
                break;
            case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
                Log.v("error extra","media error unsupported");
                break;
            case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
                Log.v("error extra","media error timed out");
                break;
        }
    }

或者是否有任何听众在播放时提供播放器的当前位置?我可以使用while(isPlaying()){int currentposition = mVideoView.getCurrrentPosition()},但我认为这是处理事情的坏方法。任何建议都将非常感谢。提前谢谢。

4 个答案:

答案 0 :(得分:1)

我展示了我用过的处理程序......

$.SetInLocalStorageVideoTime("blahblah").Interval();

你应该使用处理程序..

答案 1 :(得分:0)

你使用while的东西走在正确的轨道上,但它需要更多的精炼,因为while可能会完全阻止UI。

所以你应该做的是使用一个Handler,它会在{1}}位置每1秒触发一次检查,我认为1秒是非常合理的。

我已经使用这种方法为MediaPlayer实现自定义MediaPlayer,并且它非常完美。

答案 2 :(得分:0)

回答我的问题:

ScheduledExecutorService帮助解决了这个问题:

以下是我在播放器播放时获取当前位置的方式:

    ScheduledExecutorService mScheduledExecutorService;
    int mCurrentposition = 0;
    Runnable UpdateCurrentPosition = new Runnable(){

        @Override
        public void run() {
            mCurrentposition = mVideoView.getCurrentPosition();
        }
    };

    @Override
    protected void onCreate(){
        ...
        mScheduledExecutorService = new ScheduledExecutor(1);

        mScheduledExecutorService.scheduleWithFixedDelay(new Runnable(){
            @Override
            public void run() {
                mVideoView.post(UpdateCurrentPosition);
            }
        },3000,1000,TimeUnit.MILLISECONDS);
    }

答案 3 :(得分:0)

private int time = 0;

private ScheduledExecutorService mScheduledExecutorService;
Runnable getPositionVideo = () -> {
    time = binding.videoView.getCurrentPosition();

};


   binding.videoView.setOnPreparedListener(mediaPlayer -> {
        binding.videoView.seekTo(position);
        binding.videoView.start();
        mScheduledExecutorService = new ScheduledThreadPoolExecutor(1);
        mScheduledExecutorService.scheduleWithFixedDelay(() -> {
            runOnUiThread(getPositionVideo);
            MediaControllerExitFullScreen.init(video_url, time);
        }, 1000, 1000, TimeUnit.MILLISECONDS);