Android播放MP3实现进度条

在Android开发中,我们经常需要实现音频播放功能,并且需要显示播放进度条,让用户可以随时了解当前播放的进度。本文将介绍如何在Android中实现这一功能,并提供相应的代码示例。

1. 添加依赖

首先,我们需要在build.gradle文件中添加MediaPlayer库的依赖。在dependencies部分添加以下代码:

dependencies {
    implementation 'androidx.media:media:1.4.0'
}

2. 准备MP3文件

在实现播放功能之前,我们需要准备一个MP3文件作为音频源。将MP3文件放置在res/raw目录下。

3. 实现播放器

接下来,我们需要创建一个MediaPlayer对象,并设置音频源。同时,我们还需要实现MediaPlayer的回调接口,以便监听播放状态和进度。

import android.media.MediaPlayer;

public class MediaPlayerHelper implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {

    private MediaPlayer mediaPlayer;

    public MediaPlayerHelper() {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setOnCompletionListener(this);
        mediaPlayer.setOnErrorListener(this);
    }

    public void setDataSource(String path) {
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);
            mediaPlayer.prepareAsync();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void play() {
        if (!mediaPlayer.isPlaying()) {
            mediaPlayer.start();
        }
    }

    public void pause() {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
        }
    }

    public void stop() {
        mediaPlayer.stop();
    }

    public int getDuration() {
        return mediaPlayer.getDuration();
    }

    public int getCurrentPosition() {
        return mediaPlayer.getCurrentPosition();
    }

    public boolean isPlaying() {
        return mediaPlayer.isPlaying();
    }

    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        // 音频准备完成后的处理
    }

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        // 音频播放完成后的处理
    }

    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
        // 音频播放错误的处理
        return false;
    }
}

在上述示例代码中,我们创建了一个MediaPlayerHelper类,该类封装了MediaPlayer的常用功能,并实现了MediaPlayer的回调接口。

4. 更新进度条

为了实现进度条的功能,我们需要在播放过程中不断地获取当前的播放进度,并将其更新到进度条上。

import android.os.Handler;
import android.os.Message;
import android.widget.ProgressBar;

public class ProgressHelper extends Handler {

    private static final int MSG_UPDATE_PROGRESS = 1;

    private ProgressBar progressBar;
    private MediaPlayerHelper mediaPlayerHelper;

    public ProgressHelper(ProgressBar progressBar, MediaPlayerHelper mediaPlayerHelper) {
        this.progressBar = progressBar;
        this.mediaPlayerHelper = mediaPlayerHelper;
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            case MSG_UPDATE_PROGRESS:
                int currentPosition = mediaPlayerHelper.getCurrentPosition();
                int totalDuration = mediaPlayerHelper.getDuration();
                progressBar.setMax(totalDuration);
                progressBar.setProgress(currentPosition);
                sendEmptyMessageDelayed(MSG_UPDATE_PROGRESS, 1000);
                break;
        }
    }

    public void start() {
        sendEmptyMessage(MSG_UPDATE_PROGRESS);
    }

    public void stop() {
        removeMessages(MSG_UPDATE_PROGRESS);
    }
}

上述代码中,我们创建了一个ProgressHelper类,该类继承自Handler,并重写了handleMessage方法。在handleMessage方法中,我们获取当前播放位置和总时长,并更新进度条的进度。同时,我们通过定时发送消息的方式,实现了每隔1秒更新一次进度条的功能。

5. 创建界面

最后,我们需要创建一个界面来显示播放进度条和播放控制按钮。在XML布局文件中添加以下代码:

<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="?android:attr/progressBarStyleHorizontal"/>

<Button
    android:id="@+id/playButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="播放"/>

<Button
    android:id="@+id/pauseButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="暂停"/>

<Button
    android:id="@+