android中解析lrc歌词

来源:互联网 发布:mac safari设置主页 编辑:程序博客网 时间:2024/05/01 17:00

lrc歌词的解析可以通过通过正则表达式的方式进行解析,本文采用了此种方式。


1.定义歌词实体类


import java.util.HashMap;import java.util.Map;/* * 用于封装歌词的类 * @author *  * */public class LrcInfo {private String title;//music titleprivate String artist;//artist nameprivate String album;//album nameprivate String bySomeBody;//the lrc makerprivate String offset;//the time delay or bring forwardprivate Map<Long,String> infos;//保存歌词信息和时间点一一对应的Mappublic String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getArtist() {return artist;}public void setArtist(String artist) {this.artist = artist;}public String getAlbum() {return album;}public void setAlbum(String album) {this.album = album;}public String getBySomeBody() {return bySomeBody;}public void setBySomeBody(String bySomeBody) {this.bySomeBody = bySomeBody;}public String getOffset() {return offset;}public void setOffset(String offset) {this.offset = offset;}public Map<Long, String> getInfos() {return infos;}public void setInfos(Map<Long, String> infos) {this.infos = infos;}}

2.定义解析类


import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import java.util.TreeMap;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.util.Log;/* * 此类用来解析LRC文件 *  */public class LrcParser {private LrcInfo lrcinfo= new LrcInfo(); //存放临时时间private long currentTime = 0 ;//存放临时歌词private String currentContent=null;//用于保存时间点和歌词之间的对应关系//private Map<Long,String> maps =new HashMap<Long,String>();private Map<Long,String> maps=new TreeMap<Long,String>();/* * 根据文件路径,读取文件,返回一个输入流 * @parampath文件路径 * @return InputStream 文件输入流 * @throws FileNotFoundException * */private InputStream readLrcFile(String path) throws FileNotFoundException{File f=new File(path);InputStream ins = new FileInputStream(f);return ins;}public LrcInfo parser(String path)throws Exception{InputStream in = readLrcFile(path);lrcinfo = parser(in);return lrcinfo;}/** * @param inputStream 输入流 * @return  *  * */public LrcInfo parser(InputStream inputStream) throws IOException{//包装对象InputStreamReader inr = new InputStreamReader(inputStream);BufferedReader reader =new BufferedReader(inr);//一行一行的读,每读一行解析一行String line =null;while((line=reader.readLine())!=null){parserLine(line);}//全部解析完后,设置infolrcinfo.setInfos(maps);Iterator<Entry<Long, String>> iter = maps.entrySet().iterator();while (iter.hasNext()) {    Entry<Long,String> entry = (Entry<Long,String>)iter.next();    Long key = entry.getKey();    String val = entry.getValue();    Log.e("---", "key="+key+"   val="+val);} return lrcinfo;}/** * 利用正则表达式解析每行具体语句 * 并将解析完的信息保存到LrcInfo对象中 * @param line */private void parserLine(String line) {//获取歌曲名信息if(line.startsWith("[ti:")){String title =line.substring(4,line.length()-1);Log.i("","title-->"+title);lrcinfo.setTitle(title);}//取得歌手信息else if(line.startsWith("[ar:")){String artist = line.substring(4, line.length()-1);Log.i("","artist-->"+artist);lrcinfo.setArtist(artist);}//取得专辑信息else if(line.startsWith("[al:")){String album =line.substring(4, line.length()-1);Log.i("","album-->"+album);lrcinfo.setAlbum(album);}//取得歌词制作者else if(line.startsWith("[by:")){String bysomebody=line.substring(4, line.length()-1);Log.i("","by-->"+bysomebody);lrcinfo.setBySomeBody(bysomebody);}//通过正则表达式取得每句歌词信息else{//设置正则表达式 String reg ="\\[(\\d{1,2}:\\d{1,2}\\.\\d{1,2})\\]|\\[(\\d{1,2}:\\d{1,2})\\]";Pattern pattern = Pattern.compile(reg);Matcher matcher=pattern.matcher(line);//如果存在匹配项则执行如下操作while(matcher.find()){//得到匹配的内容String msg=matcher.group();//得到这个匹配项开始的索引int start = matcher.start();//得到这个匹配项结束的索引int end = matcher.end();//得到这个匹配项中的数组int groupCount = matcher.groupCount();for(int index =0;index<groupCount;index++){String timeStr = matcher.group(index);Log.i("","time["+index+"]="+timeStr);if(index==0){//将第二组中的内容设置为当前的一个时间点currentTime=str2Long(timeStr.substring(1, timeStr.length()-1));}}//得到时间点后的内容String[] content = pattern.split(line);//for(int index =0; index<content.length; index++){Log.i("","content="+content[content.length-1]);//if(index==content.length-1){//将内容设置魏当前内容currentContent = content[content.length-1];//}//}//设置时间点和内容的映射maps.put(currentTime, currentContent);Log.i("","currentTime--->"+currentTime+"   currentContent--->"+currentContent);//遍历map}}}private long str2Long(String timeStr){//将时间格式为xx:xx.xx,返回的long要求以毫秒为单位Log.i("","timeStr="+timeStr);String[] s = timeStr.split("\\:");int min = Integer.parseInt(s[0]);int sec=0;int mill=0;if(s[1].contains(".")){String[] ss=s[1].split("\\.");sec =Integer.parseInt(ss[0]);mill=Integer.parseInt(ss[1]);Log.i("","s[0]="+s[0]+"s[1]"+s[1]+"ss[0]="+ss[0]+"ss[1]="+ss[1]);}else{sec=Integer.parseInt(s[1]);Log.i("","s[0]="+s[0]+"s[1]"+s[1]);}return min*60*1000+sec*1000+mill*10;}}

3.解析调用


import android.app.Activity;import android.os.Bundle;import android.util.Log;public class Lyric extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        LrcParser lp =new LrcParser();String path="/sdcard/Hotel California";try{Log.i("____Lyric___", "--begin--");lp.parser(path);}catch(Exception e){}    }}


原创粉丝点击