音乐播放器
一、实现的功能
- 实现播放,暂停,停止,播放上一首,下一首功能
- 显示播放列表
- 至少可以播放3首歌曲
二、界面截图
视频:
https://coding.net/u/yangguangyoyo/p/Music/git/blob/master/2019-01-04_22_52_45_tmp_tmp.mp4
apk运行结果:
三、部分实现代码
1:切分(获取歌名、歌手、播放时间)
if (song.song.contains("-")) { String[] str = song.song.split("-"); str[0]=str[0].trim(); str[1]=str[1].trim(); song.singer = str[0]; song.song = str[1]; } list.add(song);
2:获取歌曲的各部分信息
song.song = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));//获取歌名
song.singer = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));//获取歌手
song.path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));/获取歌曲所在的路径
song.duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));//获取时间
song.size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
3:设置时间输出格式
//设置当前播放进度、播放总进度的时间格式
private String parseTime(int oldTime) {
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");// 时间格式
String newTime = sdf.format(new Date(oldTime));
return newTime;
}
4:切换图片(播放与暂停图片的切换)
//切换图片(播放/暂停的图标的切换) public void setCut_picture(){ if(cut_picture){ play.setImageResource(R.drawable.play); }else{ play.setImageResource(R.drawable.pause); } cut_picture = !cut_picture; }
5:播放初始化歌曲
//初始化,歌曲选择第一首歌曲
try {
mediaPlayer.setDataSource(list.get(0).path);//在列表中寻找poistion位置的歌曲的路径
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mSeekBar.setProgress(0);//切歌一开始设置进度为0
mSeekBar.setMax(mediaPlayer.getDuration());//设置进度条的总长度为音乐的总时间
Total_time.setText(parseTime(mediaPlayer.getDuration()));//获取音乐的总时间
updateProgress();//更新进度条
6:播放,暂停,停止,播放上一首,下一首功能
点击按钮响应:
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {//重置按钮的响应
if(mediaPlayer.isPlaying()){
mediaPlayer.reset();//停止播放
try {
mediaPlayer.reset();//重置歌曲
mediaPlayer.setDataSource(list.get(Position).path);//在列表中寻找poistion位置的歌曲的路径
mediaPlayer.prepare();
mediaPlayer.start();//开始播放
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.last_song://上一曲
Cut_song(--Position);
break;
case R.id.play://播放/停止 包括图标的切换
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();//暂停
play.setImageResource(R.drawable.play);
cut_picture = false;
} else {
mediaPlayer.start();//播放
play.setImageResource(R.drawable.pause);
cut_picture = true;
}
break;
case R.id.next_song:
Cut_song(++Position);
break;
}
}
7:切歌
//切歌
private void Cut_song(int position){
//设置切歌后显示的按钮图标为播放图标
play.setImageResource(R.drawable.pause);
cut_picture = true;
//防止索引歌曲列表时超界,形成一个圈
if (position<0){
Position = position =list.size()-1;
}else if (position>list.size()-1){
Position = position=0;
}
if (mediaPlayer==null){
mediaPlayer=new MediaPlayer();
}
try {
mediaPlayer.reset();//重置歌曲
mediaPlayer.setDataSource(list.get(Position).path);//在列表中寻找poistion位置的歌曲的路径
mediaPlayer.prepare();
mediaPlayer.start();//开始播放
} catch (IOException e) {
e.printStackTrace();
}
mSeekBar.setProgress(0);//切歌一开始设置进度为0
mSeekBar.setMax(mediaPlayer.getDuration());//设置进度条的总长度为音乐的总时间
Total_time.setText(parseTime(mediaPlayer.getDuration()));//获取音乐的总时间
updateProgress();//更新进度条
}
8:进度条的更新
/更新进度条代码
private void updateProgress() {
Message msg = Message.obtain();
int progress = mediaPlayer.getCurrentPosition();
msg.arg1 = progress;
mHandler.sendMessageDelayed(msg, INTERNAL_TIME);
}
9:进度条的实现(手动调节的实现)
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
// 当手停止拖拽进度条时执行该方法
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
cut_picture = false;
mediaPlayer.seekTo(progress);
setCut_picture();
}
四、代码链接
五、APK链接