为什么搜索栏不会像youtube视频在Android中播放一样移动?

时间:2016-12-14 15:28:16

标签: android youtube youtube-api

我在我的android项目中实现了一个youtube播放器(片段)。我正在尝试以无铬播放器风格播放视频,同时实现我自己的播放器控制。播放和暂停按钮工作正常,但随着视频的进展,搜索栏不会移动。虽然,我可以通过它跳过视频(提前播放视频),但搜索栏不是自己移动的。我哪里出错了?

    @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
            if (!b) {
                YPlayer = youTubePlayer;
                displayCurrentTime();      // It displays current progress of video in --:-- format. It's working fine...
                YPlayer.loadVideo(id);     // id -> YouTube video id
                YPlayer.play();
                YPlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
                YPlayer.setPlayerStateChangeListener(new YouTubePlayer.PlayerStateChangeListener() {
                    @Override
                    public void onLoading() {
                    }

                    @Override
                    public void onLoaded(String s) {
                    }

                    @Override
                    public void onAdStarted() {
                    }

                    @Override
                    public void onVideoStarted() {
                        seekBar.setMax(YPlayer.getDurationMillis()/1000);
                    }

                    @Override
                    public void onVideoEnded() {
                    }

                    @Override
                    public void onError(YouTubePlayer.ErrorReason errorReason) {
                    }
                });

                YPlayer.setPlaybackEventListener(new YouTubePlayer.PlaybackEventListener() {
                    @Override
                    public void onPlaying() {
                        handler.postDelayed(runnable, 100);   //Handler's instance initialized as instance variable
                        displayCurrentTime();
                    }

                    @Override
                    public void onPaused() {
                        handler.removeCallbacks(runnable);
                    }

                    @Override
                    public void onStopped() {
                    }

                    @Override
                    public void onBuffering(boolean b) {
                        handler.postDelayed(runnable, 1000);
                    }

                    @Override
                    public void onSeekTo(int i) {
                        handler.removeCallbacks(runnable);
                    }
                });
                playerControl.setVisibility(View.VISIBLE);   //Layout with play (and pause) button, Seekbar (which isn't moving along with the video), and timer (string being returned by the above displayCurrentTime() method)
            }
        }

        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
        }
    });
    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            long lengthPlayed = (YPlayer.getDurationMillis() * progress) / 100;
            YPlayer.seekToMillis((int) lengthPlayed);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            while(YPlayer != null && seekBar.getMax() > YPlayer.getCurrentTimeMillis())
            {
                int videoProgressed = 0;
                try
                {
                    Thread.sleep(1000);
                    videoProgressed = YPlayer.getCurrentTimeMillis();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                seekBar.setProgress(videoProgressed);
            }
        }
    });


    private void displayCurrentTime() {
        if (YPlayer != null) {
            String formattedTime = formatTime(YPlayer.getCurrentTimeMillis());
            playTime.setText(formattedTime);
        }
    }

    private String formatTime(int millis) {
        int seconds = millis / 1000;
        int minutes = seconds / 60;

        return String.format("%02d:%02d", minutes % 60, seconds % 60);
    }

    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if(YPlayer != null) {
                displayCurrentTime();
            }
            handler.postDelayed(this, 1000);
        }
    };

3 个答案:

答案 0 :(得分:0)

如果可以帮助您,请查看此tutorial。本教程是关于Android Building Audio Player的。它在这里讨论如何构建一个简单的音频播放器,其中包括播放,暂停,前进,后退,下一个,上一个,播放列表和搜索栏等基本控件。

只需检查教程解释如何更新在使用Handler在后台运行的后台线程中实现的进度条计时器的代码。您可以在此处查看搜索栏的实施方式。

有关详情,请查看相关的SO question

答案 1 :(得分:0)

添加youtubeSeekBar.setProgress(yPlayer.getCurrentTimeMillis()/ 100);在play()事件中

YPlayer.setPlaybackEventListener(new YouTubePlayer.PlaybackEventListener() {
                @Override
                public void onPlaying() {
                    handler.postDelayed(runnable, 100);   //Handler's instance initialized as instance variable
                    displayCurrentTime();

youtubeSeekBar.setProgress(yPlayer.getCurrentTimeMillis()/100); //this is your key of success
                }

                @Override
                public void onPaused() {
                    handler.removeCallbacks(runnable);
                }

                @Override
                public void onStopped() {
                }

                @Override
                public void onBuffering(boolean b) {
                    handler.postDelayed(runnable, 1000);
                }

                @Override
                public void onSeekTo(int i) {
                    handler.removeCallbacks(runnable);
                }
            });
            playerControl.setVisibility(View.VISIBLE);   //Layout with play (and pause) button, Seekbar (which isn't moving along with the video), and timer (string being returned by the above displayCurrentTime() method)
        }

答案 2 :(得分:0)

使用此代码

自定义youtube播放器无色样式-设置SeekBar进度和SeekBar跟踪触摸前进/后退

mSeekBar = (SeekBar) findViewById(R.id.video_seekbar);

mSeekBar.setOnSeekBarChangeListener(mVideoSeekBarChangeListener)

SeekBar.OnSeekBarChangeListener mVideoSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        long lengthPlayed = (mYouTubePlayer.getDurationMillis() * seekBar.getProgress()) / 100;
        mYouTubePlayer.seekToMillis((int) lengthPlayed);
    }
};

private Runnable runnable = new Runnable() {
    @Override
    public void run(){
        displayCurrentTime();
        mHandler.postDelayed(this, 100);
    }
};


 private void displayCurrentTime() {
    if (null == mYouTubePlayer) return;
    String formattedTime = formatTime(mYouTubePlayer.getDurationMillis() - mYouTubePlayer.getCurrentTimeMillis());
    play_timetv.setText(formattedTime);
    playPercent = (int) (((float) mYouTubePlayer.getCurrentTimeMillis()/(float) mYouTubePlayer.getDurationMillis()) * 100);
    System.out.println("get youtube displayTime 2 : "+playPercent);
    // update live progress
    mSeekBar.setProgress(playPercent, true);
}

Custom youtube player