MediaPlayer,ProgressBar

pou*_*ler 11 android seekbar

这是播放媒体时更新ProgressBar的正确方法吗?我想在MediaPlayer中会有一个回调,但我找不到它.

mediaPlayer.start();
final SeekBar progress = (SeekBar) dialog.findViewById(R.id.seekBar1);
progress.setMax(mediaPlayer.getDuration());
new CountDownTimer(mediaPlayer.getDuration(), 250) {
  public void onTick(long millisUntilFinished) {
    progress.setProgress(progress.getProgress() + 250);
  }
  public void onFinish() {}
}.start();
Run Code Online (Sandbox Code Playgroud)

最好的祝福.

JRa*_*ond 22

就个人而言,我开始一个getCurrentPosition()每200ms左右检查一次的线程,直到onCompletion()事件被触发:

private class MediaObserver implements Runnable {
  private AtomicBoolean stop = new AtomicBoolean(false);

  public void stop() {
    stop.set(true);
  }

  @Override
  public void run() {
    while (!stop.get()) {
      progress.setProgress(mediaPlayer.getCurrentPosition());
      Thread.sleep(200);
    }
  }
}

private MediaObserver observer = null;

public void runMedia() {
  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener{
    @Override
    public void onCompletion(MediaPlayer mPlayer) {
      observer.stop();
      progress.setProgress(mPlayer.getCurrentPosition());
    }
  });
  observer = new MediaObserver();
  mediaPlayer.start();
  new Thread(observer).start();
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*tai 11

看看android.widget.MediaController,它有一个进度条.

它们使用一个处理程序,如果合适的话递归调用它自己.您可以将延迟设置为您希望更新进度条的频率.

请注意,控制器可以显示或隐藏,也可以由用户拖动,当然 - 视频可以停止.这些是!mDragging && mShowing && mVideoView.isPlaying()在另一个递归调用更新条之前进行各种检查()的原因.

protected Handler mHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        int pos;
        switch (msg.what)
        {
            // ...

            case SHOW_PROGRESS:
                pos = setProgress();
                if (!mDragging && mShowing && mVideoView.isPlaying())
                {
                    msg = obtainMessage(SHOW_PROGRESS);
                    sendMessageDelayed(msg, 1000 - (pos % 1000));
                }
                break;

             // ...
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

开始使用:

mHandler.sendEmptyMessage(SHOW_PROGRESS);
Run Code Online (Sandbox Code Playgroud)

它将自行停止,但您应该使用以下命令取消上一个待处理的请求:

mHandler.removeMessages(SHOW_PROGRESS);
Run Code Online (Sandbox Code Playgroud)