Android MediaPlayer多次seekTo进度条跳

在Android应用中,我们经常需要使用MediaPlayer来播放音频或视频文件。而在一些特定的场景下,我们可能需要通过多次调用MediaPlayer的 seekTo 方法来实现快速定位到指定的位置。然而,这样做可能会导致进度条的跳动,给用户带来不好的体验。本文将介绍如何解决Android MediaPlayer多次seekTo进度条跳动的问题,并附带代码示例。

当我们在播放音频或视频时,通常会显示一个进度条来表示当前的播放进度。而当我们通过多次调用MediaPlayer的 seekTo 方法来实现快速定位时,进度条会出现跳动的现象。这是因为每次调用 seekTo 方法后,MediaPlayer会重新加载并播放音频或视频,导致进度条跳到新的位置。而用户可能希望进度条能够平滑地滑动到指定位置,而不是跳动。

为了解决Android MediaPlayer多次seekTo进度条跳动的问题,我们可以通过以下方法来实现平滑滑动的效果。

1. 获取音频或视频的总时长

在开始播放音频或视频之前,我们可以通过MediaPlayer的 getDuration 方法来获取音频或视频的总时长。然后,我们可以将总时长作为进度条的最大值。

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(filePath);
mediaPlayer.prepare();
int duration = mediaPlayer.getDuration();
// 设置进度条的最大值为音频或视频的总时长
progressBar.setMax(duration);

2. 使用Handler更新进度条

为了实现平滑滑动的效果,我们可以使用Handler来定时更新进度条的进度。在每次更新进度条的时候,我们可以根据MediaPlayer的当前播放位置来设置进度条的当前值。

Handler handler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        if (mediaPlayer.isPlaying()) {
            int currentPosition = mediaPlayer.getCurrentPosition();
            // 设置进度条的当前值为MediaPlayer的当前播放位置
            progressBar.setProgress(currentPosition);
        handler.postDelayed(this, 1000); // 每隔1秒更新一次进度条
handler.postDelayed(runnable, 1000);

3. 使用SeekBar实现平滑滑动

如果我们使用SeekBar来显示进度条,我们可以通过SeekBar的setOnSeekBarChangeListener方法来监听用户对进度条的拖动操作。当用户拖动进度条时,我们可以通过MediaPlayer的seekTo方法来实现快速定位。

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            mediaPlayer.seekTo(progress);
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // 用户开始拖动进度条时,停止更新进度条
        handler.removeCallbacks(runnable);
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // 用户停止拖动进度条时,重新开始更新进度条
        handler.postDelayed(runnable, 1000);

下图是本文中使用的MediaPlayer和SeekBar的类图。

classDiagram
    class MediaPlayer {
        +getDuration(): int
        +getCurrentPosition(): int
        +setDataSource(filePath: String): void
        +prepare(): void
        +start(): void
        +pause(): void
        +stop(): void
        +seekTo(position: int): void
        +isPlaying(): boolean
    class SeekBar {
        +setMax(max: int): void
        +setProgress(progress: int): void
        +setOnSeekBarChangeListener(listener: OnSeekBarChangeListener): void
    interface OnSeekBarChangeListener {
        +onProgressChanged(seekBar: SeekBar, progress: int, fromUser: boolean): void
        +onStartTrackingTouch(seekBar: SeekBar): void
        +onStopTrackingTouch(seekBar: SeekBar): void

通过以上的解决方案,我们可以实现Android MediaPlayer多次seekTo进度条平滑滑动的效果。通过获取音频或

  1、创建数据库:create database [数据库名]   2、删除数据库:drop database [数据库名]   3、修改数据库的编码:alter database [数据库名] charset gbk;