Android本地音乐播放器(二)
2018-01-05 12:18
225 查看
在上一篇博客当中,我们写到了本地音乐的获取,并且播放指定条目的音乐,在这个案例中将会添加上一曲,下一曲等功能。
布局和音乐信息类没有变化,主要是activity当中的类有逻辑代码的改变。activity代码如下:
查看具体代码请下载:
http://download.csdn.net/download/u012156341/10189776
布局和音乐信息类没有变化,主要是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
相关文章推荐
- Android本地音乐播放器
- 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现
- Android 音乐播放器的开发教程(五)本地音乐的获取及显示 ----- 小达
- Android播放本地音乐播放器
- Android Mediaplayer本地音乐播放器(绑定服务)
- Android 超简单音乐播放器(二)添加本地音乐 (RecyclerView)(Cursor)
- Android 简单的本地音乐播放器Demo
- Android简单本地音乐播放器
- Android 超简单音乐播放器(三)根据歌曲名或者歌手搜索本地音乐(EditText监听)
- Android构造音乐播放器并实现获取本地音乐
- 项目源码--Android本地音乐播放器
- Android开发----音乐播放器(扫描本地音乐)
- Android开发之本地音乐播放器(简单粗暴版)
- Android本地音乐播放器的制作
- android简易的本地音乐播放器
- 简单实现Android本地音乐播放器
- Android之简单本地音乐播放器
- android 音乐播放器 本地音乐文件
- android本地音乐播放器
- android本地音乐播放器