droid Mediaplayer播放一个音频代码,要有进度条
时间: 2023-05-26 15:03:52 浏览: 57
以下是一个droid Mediaplayer播放音频并带有进度条的示例代码:
step1:在xml文件中定义一个SeekBar和两个TextView
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:progressBackgroundTint="@color/colorPrimaryLight"
android:progressTint="@color/colorAccent"
android:thumbTint="@color/colorAccent" />
<TextView
android:id="@+id/tvCurrentTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:text="00:00"
android:textSize="12sp" />
<TextView
android:id="@+id/tvTotalTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="16dp"
android:gravity="end"
android:text="00:00"
android:textSize="12sp" />
step2:在Activity或Fragment中定义MediaPlayer和SeekBar及对应的TextView
private MediaPlayer mediaPlayer;
private SeekBar seekBar;
private TextView tvCurrentTime;
private TextView tvTotalTime;
step3:在onCreate()或onViewCreated()中初始化MediaPlayer和SeekBar及对应的TextView
mediaPlayer = MediaPlayer.create(this, R.raw.my_audio_file);
seekBar = findViewById(R.id.seekBar);
tvCurrentTime = findViewById(R.id.tvCurrentTime);
tvTotalTime = findViewById(R.id.tvTotalTime);
seekBar.setMax(mediaPlayer.getDuration());
step4:在SeekBar的onProgressChanged()回调中更新mediaPlayer的进度
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress);
tvCurrentTime.setText(formatTime(progress));
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
step5:在MediaPlayer的onPrepared()回调中设置TextView的内容和启动SeekBar的更新进度线程
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
int duration = mediaPlayer.getDuration();
tvTotalTime.setText(formatTime(duration));
new Thread(new Runnable() {
@Override
public void run() {
while (mediaPlayer.isPlaying()) {
try {
int position = mediaPlayer.getCurrentPosition();
seekBar.setProgress(position);
tvCurrentTime.post(new Runnable() {
@Override
public void run() {
tvCurrentTime.setText(formatTime(mediaPlayer.getCurrentPosition()));
}
});
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
mediaPlayer.start();
}
});
step6:为了避免内存泄漏,在onDestroy()或onDestroyView()中释放MediaPlayer和SeekBar
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
step7:编写一个辅助方法formatTime将毫秒转换为分钟和秒钟的格式
private String formatTime(int duration) {
int seconds = duration / 1000;
int minutes = seconds / 60;
seconds = seconds % 60;
return String.format("%02d:%02d", minutes, seconds);
}