Android 第三次作业

音乐播放器

一、实现的功能

  • 实现播放,暂停,停止,播放上一首,下一首功能
  • 显示播放列表
  • 至少可以播放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链接

 

posted @ 2018-12-11 22:33  阳光yoyo  阅读(246)  评论(0编辑  收藏  举报