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="@+