Android开发简单mp3播放器
简单的mp3播放器,可用于Android课程大作业。可以播放上一首,下一首,停止播放,继续播放,拖动进度条功能。
一、思路
用MediaPlayer
二、效果图:
三、关键代码:
public class MainActivity extends AppCompatActivity {
private ImageView diskImage;
private SeekBar musicProgress;
private TextView currentTime, totalTime;
private ImageView prevBtn, playPauseBtn, nextBtn;
private ObjectAnimator animator;
private MediaPlayer player;
private int currentPlaying = 0; //用作ArrayList下表,当前播放的歌曲、
private ArrayList<Integer> playList = new ArrayList<>();
private boolean isPausing, isPlaying; //音乐暂停状态,音乐第一次播放之后变为true
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
preparePlayList();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
if (isPlaying) {
updateTimer();
}
}
};
new Timer().scheduleAtFixedRate(timerTask, 0, 500);
}
private void init() {
diskImage = findViewById(R.id.iv_anim);
musicProgress = findViewById(R.id.sb_progress);
currentTime = findViewById(R.id.tv_progress_current);
totalTime = findViewById(R.id.tv_progress_total);
prevBtn = findViewById(R.id.btn_prev);
playPauseBtn = findViewById(R.id.btn_play_pause);
nextBtn = findViewById(R.id.btn_next);
View.OnClickListener onClick = new OnClickControl();
prevBtn.setOnClickListener(onClick);
playPauseBtn.setOnClickListener(onClick);
nextBtn.setOnClickListener(onClick);
OnSeekBarChangeControl onSbChange = new OnSeekBarChangeControl();
musicProgress.setOnSeekBarChangeListener(onSbChange);
animator = ObjectAnimator.ofFloat(diskImage, "rotation", 0, 360.0F); //初始化状态
animator.setDuration(2000); //状态时长,10秒
animator.setInterpolator(new LinearInterpolator()); //时间函数,有很多类型
animator.setRepeatCount(-1); // 一直旋转
}
private void preparePlayList() {
Field[] field = R.raw.class.getFields();
for (int count = 0; count < field.length; count++) {
Log.i("Raw Asset", field[count].getName());
try {
int resId = field[count].getInt(field[count]);
playList.add(resId);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
private void prepareMedia() {
if (isPlaying) {
player.stop();
player.reset();
}
player = MediaPlayer.create(getApplicationContext(), playList.get(currentPlaying));
int musicDuration = player.getDuration();
musicProgress.setMax(musicDuration);
int sec = musicDuration / 1000;
int min = sec / 60;
sec -= min * 60;
String musicTime = String.format("%02d:%02d", min, sec);
totalTime.setText(musicTime);
player.start();
}
private void updateTimer() {
runOnUiThread(() -> {
int currentMs = player.getCurrentPosition();
int sec = currentMs / 1000;
int min = sec / 60;
sec -= min * 60;
String time = String.format("%02d:%02d", min, sec);
musicProgress.setProgress(currentMs);
currentTime.setText(time);
});
}
private class OnClickControl implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_prev:
//重播
playPauseBtn.setImageResource(R.mipmap.ic_pause); //切换成暂停键
animator.start();
if (player != null && !player.isPlaying()) {
currentPlaying = --currentPlaying % playList.size();
}
prepareMedia();
isPausing = false;
isPlaying = true;
break;
case R.id.btn_play_pause:
//开始暂停
if (!isPausing && !isPlaying) { //暂停状态,且从未被播放
//开始播放
playPauseBtn.setImageResource(R.mipmap.ic_pause); //切换成暂停键
animator.start();
prepareMedia();
isPlaying = true;
} else if (!isPausing && isPlaying) { //暂停状态,且被播放过一次
//继续播放
playPauseBtn.setImageResource(R.mipmap.ic_pause);//切换成暂停键
animator.resume();
player.start();
} else { //播放状态
四、项目demo源码结构图:
有问题或者需要完整源码demo的可以看简介联系我,也可以私信我,我每天都看私信的