定制的YouTube播放器不更新进度条。

3

我创建了自己的播放器布局并使用了Youtube API来显示视频内容,但是当视频开始播放时,我的进度条不更新并保持不变。我认为问题在于 mSeekBarChangeListener 中,但我不确定。

这是我的代码:

  public class ItemDetails extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener,View.OnClickListener {

    private final static String TAG = "ItemDetails";

    @BindView(R.id.item_title)TextView itemTitle;
    @BindView(R.id.item_date)TextView itemDate;
    @BindView(R.id.item_plot)TextView itemPlot;
    @BindView(R.id.item_short_description)TextView itemShortDescription;
    @BindView(R.id.backdop_image_details)ImageView imageBackdrop;
    @BindView(R.id.tv_more)TextView tvSeeMore;
    @BindView(R.id.trailer_video)YouTubePlayerView traileVideo;
    @BindView(R.id.video_control)LinearLayout videoControlLayout;
    @BindView(R.id.play_time)TextView mPlayTimeTextView;
    @BindView(R.id.video_seekbar)SeekBar mSeekBar;

    YouTubePlayer mPlayer;

    private Handler mHandler = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item_details);

        ButterKnife.bind(this);

        findViewById(R.id.play_video).setOnClickListener(this);
        findViewById(R.id.pause_video).setOnClickListener(this);

        mSeekBar.setMax(100);
        mSeekBar.setProgress(0);
        mSeekBar.setOnSeekBarChangeListener(mVideoSeekBarChangeListener);
        mHandler = new Handler();

    }

    @OnClick(R.id.back_arrow_detail)void backArrowClick() {
        onBackPressed();
    }


    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
        if(youTubePlayer != null) {
            mPlayer = youTubePlayer;

            displayCurrentTime();

            // start buffering
            if(!b) {
                youTubePlayer.cueVideo(trailerKey);
            }

            // set style and show control layout
            youTubePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
            videoControlLayout.setVisibility(View.VISIBLE);

            youTubePlayer.setPlayerStateChangeListener(playerStateChangeListener);
            youTubePlayer.setPlaybackEventListener(playbackEventListener);
        }
    }

    private YouTubePlayer.PlaybackEventListener playbackEventListener = new YouTubePlayer.PlaybackEventListener() {
        @Override
        public void onPlaying() {
            mHandler.postDelayed(runnable,100);
            displayCurrentTime();
        }

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

        @Override
        public void onStopped() {
            mHandler.removeCallbacks(runnable);
        }

        @Override
        public void onBuffering(boolean b) {

        }

        @Override
        public void onSeekTo(int i) {
            mHandler.postDelayed(runnable,100);
        }
    };

    private YouTubePlayer.PlayerStateChangeListener playerStateChangeListener = new YouTubePlayer.PlayerStateChangeListener() {
        @Override
        public void onLoading() {

        }

        @Override
        public void onLoaded(String s) {

        }

        @Override
        public void onAdStarted() {

        }

        @Override
        public void onVideoStarted() {
            displayCurrentTime();
        }

        @Override
        public void onVideoEnded() {

        }

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

        }
    };

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
        Log.d(TAG,youTubeInitializationResult.toString());
    }


    SeekBar.OnSeekBarChangeListener mVideoSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            long lengthPlayed = (mPlayer.getDurationMillis() * progress) / 100;
            mPlayer.seekToMillis((int) lengthPlayed);
            seekBar.setProgress(progress);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    };


    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.play_video:
                if(mPlayer != null && !mPlayer.isPlaying()) {
                    mPlayer.play();
                }
                break;
            case R.id.pause_video:
                if(mPlayer != null && mPlayer.isPlaying()) {
                    mPlayer.pause();;
                }
                break;
        }
    }

    private void displayCurrentTime() {
        if (null == mPlayer) return;
        String formattedTime = formatTime(mPlayer.getDurationMillis() - mPlayer.getCurrentTimeMillis());
        mPlayTimeTextView.setText(formattedTime);
    }

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

        return (hours == 0 ? "--:" : hours + ":") + String.format("%02d:%02d", minutes % 60, seconds % 60);
    }


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

1
对于所有正在寻找解决方案的人:
1. 在Runnable中设置SeekBar进度:
private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        displayCurrentTime();
//以百分比形式显示进度 int progress = mPlayer.getCurrentTimeMillis() * 100 / mPlayer.getDurationMillis(); mSeekBar.setProgress(progress);
mHandler.postDelayed(this, 100); } };
2. 由于这将启动OnSeekBarChangeListener,因此您需要添加一个额外的if条件:
SeekBar.OnSeekBarChangeListener mVideoSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//仅当用户更改进度时才执行以下操作 if(fromUser){ long lengthPlayed = (mPlayer.getDurationMillis() * progress) / 100; mPlayer.seekToMillis((int) lengthPlayed); } }
@Override public void onStartTrackingTouch(SeekBar seekBar) { }
@Override public void onStopTrackingTouch(SeekBar seekBar) { } };
;)

1
自定义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


你好,非常感谢你的回答。请问一下关于进度条的最大进度,我该如何设置进度条的最大进度? - tej shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接