经过五六天的努力,我的音乐播放器终于初步完成了,在过程中对Android有了进一步的了解。以下是我的播放器实现的功能:
1.上一曲,下一曲 ,随机播放 2.暂停,播放
3.时间,进度条随歌曲播放改变 4.歌词歌名的显示
5.来电暂停,挂断继续 6.实现后台播放
7.能遍历内存卡所有歌曲并显示出歌曲信息
8.界面的跳转 9.实现摇晃一下换歌
下面介绍一下其中的几个功能:
一. 歌词的实现
1.首先是从内出卡获取歌词
遍历内存卡,将文件都取出在判断文件类型,将包含.lrc的文件的信息保存到一个list容器中 创建一个file对象,获取当前歌曲的歌词信息
//获取歌词
public void findlrc(String path){
//创建一个file对象
File file=new File(path);
if(file.exists()){
if(file.isFile()){
if(file.getName().contains(".lrc")){ //获取后缀为lrc的文件
String s=file.getAbsolutePath();
Map<String,Object> map=new HashMap<String,Object>();
map.put("url",s );
map.put("title", file.getName().substring(0, file.getName().length()-".lrc".length()));
list_lrc.add(map);
}
}
else if(file.isDirectory()){
//如果是文件夹,就要遍历文件夹下的所有文件或目录
//创建一个File数组
File[] files=file.listFiles();
if(files!=null){
for(File f:files){
//递归调用自身
findlrc(f.getAbsolutePath());
}
}
}
}
}
2.将当前所选歌曲的歌词获取
将当前歌曲名到list中寻找与之匹配的title;若有匹配的这将歌词文件封装成文件流,再调用readLine()方法按行读取,并将文件前端的时间信息分离出来保存到time_list中(要转换格式)。否则显示“歌词不存在”
public void song(){ for(int i=0;i<PlayMusicActivity.list_lrc.size();i++){ String lrc_title=(String) list_lrc.get(i).get("title"); String lrc_url=(String) list_lrc.get(i).get("url"); if(lrc_title.equals(title)) //如果lrc_title中包含了当前歌曲名,则表示该歌曲有歌词 //System.out.println("================"+title); { File file=new File(lrc_url); FileInputStream fis; try { //将歌词封装成流 fis = new FileInputStream(file); InputStreamReader is=new InputStreamReader(fis); BufferedReader br=new BufferedReader(is); while((line=br.readLine())!=null) //读取流 { String time=line.substring(0, line.indexOf("]")+1); //因为在歌词中,时间都是放在一对【】中,所以要把时间取出来 time=time.replace("[", ""); //歌词中时间的格式是mm:ss.xx,所以要把:和.代替掉, time=time.replace("]", ""); time=time.replace(".", ":"); //在这里不能写成time=time.replace(":", ".");因为‘.’会转义 lrc_time=time.split(":"); //分离时间 line=line.substring(line.indexOf("]")+1); if(lrc_time.length==3){ Map<String,String> map=new HashMap<String,String>(); map.put("time",lrc_time[0]+":"+lrc_time[1]); map.put("line",line); time_list.add(map); System.out.println(line); } } } catch (Exception e) { e.printStackTrace(); } } else musiclrc.setText("歌词不存在"); } }
3.实现歌词的同步
因为在歌词文件中没句歌词都有对应的时间,我们只需要将歌词的时间与当前播放时间比较,若相同则显示对应的歌词。
for(final Map<String, String> t:time_list){ String str = t.get("time"); //获取歌词时间 if(s.equals(str)){ //如果当前时间与歌词时间相等则输出歌词 musiclrc.post(new Runnable(){ public void run(){ musiclrc.setText(t.get("line")); } }); } }
二.来电暂停,挂断播放
这实际就是添加一个对电话状态的监听,在这个监听接口中有各种抽象方法,我们只需要在相应的方法中对歌曲播放状态进行设置即可。
// 实现接电话暂停,挂电话开始功能 tmanger=(TelephonyManager)getSystemService(TELEPHONY_SERVICE); PhoneStateListener phone_listener=new PhoneStateListener(){ public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch(state){ case TelephonyManager.CALL_STATE_OFFHOOK: //摘机 mp.pause(); break; case TelephonyManager.CALL_STATE_RINGING: //接通电话 mp.pause(); break; case TelephonyManager.CALL_STATE_IDLE: //无活动 mp.start(); break; } } }; tmanger.listen(phone_listener, PhoneStateListener.LISTEN_CALL_STATE); //监听打电话的状态 }
在这几天的Android学习中学到了很多。不管是敲代码还是其他方面,很重要的一点是,我们要自己专研才会学到跟多东西。别人讲的我们只是听了一遍,其中的内涵还要我们不断实践,查阅资料才能理解深刻,才能学会运用。通过这几天的学习,我也开始喜欢Android这个平台,这只是一个开始阶段的小结,以后还有更多的东西等着我去学。加油。