您的位置:首页 > 移动开发 > Android开发

Android本地音乐播放器(二)

2018-01-05 12:18 225 查看
在上一篇博客当中,我们写到了本地音乐的获取,并且播放指定条目的音乐,在这个案例中将会添加上一曲,下一曲等功能。

布局和音乐信息类没有变化,主要是activity当中的类有逻辑代码的改变。activity代码如下:

public class LocalMusicActivity extends AppCompatActivity {
private ListView lv;
private List<MusicInfo>mDatas = new ArrayList<>();
private LocalMusicAdapter adapter;
private TextView singNameTv;
private TextView singerTv;
private MediaPlayer mediaPlayer;
private int currentPlayPosition = -1;   //当前正在播放的音乐的位置。
private boolean isPlaying = false;  //未播放
private int currentPausePosInSong = 0;
private ImageView playIv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_local_music);
lv = (ListView) findViewById(R.id.local_music_lv);
singNameTv = (TextView) findViewById(R.id.local_music_song);
singerTv = (TextView) findViewById(R.id.local_music_singer);
playIv = (ImageView) findViewById(R.id.local_music_play);
//        设置数据源
//        设置适配器
adapter = new LocalMusicAdapter(this,mDatas);
lv.setAdapter(adapter);
//        加载本地音乐
loadLocalData();
//      初始化媒体播放器
mediaPlayer = new MediaPlayer();
//        设置点击事件
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MusicInfo info = mDatas.get(position);
currentPlayPosition = position;
playMusicInPosition(info);
}
});
}
/**
* 播放指定内容的音乐信息
* */
public void playMusicInPosition(MusicInfo info) {
singerTv.setText(info.getSinger());
singNameTv.setText(info.getSingName());
//     因为有可能其他音乐正在被播放,所以要先停止在播放
stopMusic();
//     播放音乐
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(info.getPath());
playMusic();
} catch (IOException e) {
e.printStackTrace();
}
}

private void loadLocalData() {
//        1.获得ContentResolver对象
ContentResolver resolver = getContentResolver();
//        2.获得Uri地址
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
//        3.查找地址中的内容
Cursor cursor = resolver.query(musicUri, null, null, null, null);
//        4.遍历Cursor信息
int id= 0;
while (cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); //不带后缀的歌曲名
String display_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); //带后缀

String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));  //歌手
//            路劲
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));

long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
String time = sdf.format(new Date(duration));
id++;
String idStr = id+"";

MusicInfo info = new MusicInfo(idStr,title,singer,album,time,path);
mDatas.add(info);
}

adapter.notifyDataSetChanged();
}

/**
* 播放音乐
* 总共分为两种情况:
* 1.从停止到播放  重置播放器,然后重新准备 然后重新开始
* 2.从暂停到播放  挪动进度条到相应的暂停的位置上,然后在播放
* 怎么判断是从停止到播放还是从暂停到播放呢?
* 因为在暂停当中对于成员变量CurrentPausePosInSong进行赋值了,不等于0了,而停止这个变量为0
* 所以通过判断这个变量就能够了解是暂停到播放还是停止到播放。
*
* */
public void playMusic(){
if (mediaPlayer!=null&&!mediaPlayer.isPlaying()) {
if (currentPausePosInSong==0) {
try {
mediaPlayer.prepare();  //准备播放,因为sd卡当中的音乐,所以不写异步准备
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}else{
mediaPlayer.seekTo(currentPausePosInSong);
mediaPlayer.start();
}
isPlaying = true;
playIv.setImageResource(R.mipmap.pause);
}
}
/**
* 暂停音乐的方法
* */
public void pauseMusic(){
if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {
//            获取歌曲暂停的位置
currentPausePosInSong = mediaPlayer.getCurrentPosition();
mediaPlayer.pause();  //暂停音乐
isPlaying = false;  //改变标志位为false,因为没有播放音乐
playIv.setImageResource(R.mipmap.play);
}
}
/**
* 停止音乐
* */
public void stopMusic(){
if (mediaPlayer!=null) {
currentPausePosInSong = 0;
mediaPlayer.pause();
mediaPlayer.seekTo(0);
mediaPlayer.stop();
isPlaying  = false;
playIv.setImageResource(R.mipmap.play);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
stopMusic();
}

public void onClick(View view) {
switch (view.getId()) {
//    分析逻辑,获取当前播放的歌曲的位置,如果是第一曲,也就是说位置为0,就说明没有上一曲了,所以就提示用户,已经是第一曲了。
//    如果当前播放的位置不为0,就说明不是第一曲,那么就可以让当前正在播放的音乐的位置减去1,就是上一曲,
//     获取上一曲对象的信息,然后就可以获得位置,然后就可以对于音乐播放器进行设置了。
case R.id.local_music_last:   //点击播放上一曲的内容
if (currentPlayPosition==0) {
Toast.makeText(this,"已经是第一曲了,没有上一曲!",Toast.LENGTH_SHORT).show();
return;
}
currentPlayPosition = currentPlayPosition-1;
MusicInfo lastInfo = mDatas.get(currentPlayPosition);
//                要播放上一曲信息,需要改变的是改变两个TextView,并且重置Mediaplayer,然后设置新的播放路径
playMusicInPosition(lastInfo);
break;
case R.id.local_music_next:   //点击播放下一曲的内容
if (currentPlayPosition==mDatas.size()-1) {
Toast.makeText(this,"已经是最后一曲了,没有下一曲!",Toast.LENGTH_SHORT).show();
return;
}
currentPlayPosition = currentPlayPosition+1;
MusicInfo nextInfo = mDatas.get(currentPlayPosition);
playMusicInPosition(nextInfo);
break;
case R.id.local_music_play:   //点击播放可以切换是播放还是暂停。
if (currentPlayPosition<0){
Toast.makeText(this,"请选择想要播放的歌曲在播放",Toast.LENGTH_SHORT).show();
return;
}
if (isPlaying) {  //正在播放当中,应该暂停
pauseMusic();
}else{   //说明没有播放,点击之后应该播放
playMusic();
}
break;
}
}
}

查看具体代码请下载:

http://download.csdn.net/download/u012156341/10189776
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  音乐播放器