最近要写个音乐播放器,需要解析Lrc文件。搜索了下网上的代码大都是有问题的,很多连歌词规则都没搞懂就写了个代码传到网上,害人害已。

实在受不了解析出来乱七八糟的歌词,只能自己动手做解析,修改了别人解析部分的代码。

下面是实现部分

解析类

package com.ysh.suplay;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;/*** 解析歌词类*/
public class LrcProcess {private List<LrcContent> LrcList;private LrcContent mLrcContent;public LrcProcess() {mLrcContent = new LrcContent();LrcList = new ArrayList<LrcContent>();}/*** 解析歌词*/public String readLRC(String song_path) {// public void Read(String file){StringBuilder stringBuilder = new StringBuilder();File f = new File(song_path.substring(0, song_path.lastIndexOf("."))+ ".lrc");try {FileInputStream fis = new FileInputStream(f);InputStreamReader isr = new InputStreamReader(fis, "GB2312");BufferedReader br = new BufferedReader(isr);String s = "";while ((s = br.readLine()) != null) {s += " "; // 处理只有时间没有内容的行if ((s.indexOf("[ar:") != -1) || (s.indexOf("[ti:") != -1)|| (s.indexOf("[by:") != -1)|| (s.indexOf("[al:") != -1) || s.equals(" ")) {continue;}s = s.replace("[", "");//关键代码,歌词用的时候需要对时间进行排序String splitLrc_data[] = s.split("]");for (int i = 0; i < splitLrc_data.length - 1; i++) {//System.out.println(splitLrc_data[i]);mLrcContent.setLrc_time(TimeStr(splitLrc_data[i]));mLrcContent.setLrc(splitLrc_data[splitLrc_data.length - 1]);LrcList.add(mLrcContent);mLrcContent = new LrcContent();}//关键代码}br.close();isr.close();fis.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();stringBuilder.append("没有找到歌词文件!");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();stringBuilder.append("无法读取歌词文件!");}return stringBuilder.toString();}/*** 处理时间* 时间转换为毫秒millisecond*/public int TimeStr(String timeStr) {timeStr = timeStr.replace(":", ".");timeStr = timeStr.replace(".", "@");String timeData[] = timeStr.split("@");int currentTime = 0;// 分离出分、秒并转换为整型try {int minute = Integer.parseInt(timeData[0]);int second = Integer.parseInt(timeData[1]);int millisecond = Integer.parseInt(timeData[2]);currentTime = (minute * 60 + second) * 1000 + millisecond * 10;} catch (Exception ex) {ex.printStackTrace();}return currentTime;}public List<LrcContent> getLrcContent() {return LrcList;}/*** 歌词类 * 需要排序的话,要用Integer替代int*/public class LrcContent {private String Lrc;private Integer Lrc_time;public String getLrc() {return Lrc;}public void setLrc(String lrc) {Lrc = lrc;}public Integer getLrc_time() {return Lrc_time;}public void setLrc_time(int lrc_time) {Lrc_time = lrc_time;}}}

对时间进行排序

Collections.sort(lrcList, new Comparator<LrcContent>() {@Overridepublic int compare(LrcContent o1, LrcContent o2) {TODO Auto-generated method stubreturn o1.getLrc_time().compareTo(o2.getLrc_time());}});
for (LrcContent lrcContent : lrcList) {System.out.println(toTime(lrcContent.getLrc_time()));System.out.println(lrcContent.getLrc());
}

Android 歌词解析(完美解析)相关推荐

  1. Android Realm数据库完美解析

    转自   http://blog.csdn.net/fesdgasdgasdg/article/details/51897212 demo http://download.csdn.net/detai ...

  2. android歌词文件夹,Android歌词文本解析

    1. LRC文本解读 Android中要实现滚动歌词的第一步,是需要对LRC歌词文本进行解析,首先来看一份标准的歌词文本模式: [ti:失恋战线联盟] [ar:草蜢] [al:] [00:00.00] ...

  3. android 歌词控件,歌词显示控件的实现上——歌词解析

    最近打算仿网易云音乐的音乐播放器,除了网络框架.接口数据等这些外,最核心的就是音乐的播放和歌词的显示. 考虑到歌词显示控件涉及到歌词解析,自定义控件的实现等等诸多方面,可能文章的篇幅上会比较冗长,同时 ...

  4. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  5. Android init.rc文件格式解析

    /****************************************************************************** Android init.rc文件格式解 ...

  6. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  7. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  8. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

  9. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

最新文章

  1. python 将列和索引的值变换_【编辑小组成长日记】Python学习第二期
  2. ceph存储 PG的状态机 源码分析
  3. Android Studio的使用(三)--包不分级、修改包名
  4. springboot接收多对象_SpringBoot同时接收单个对象和List<object>参数
  5. 【朋克智库】比特币详解2.0——比特币的沉沦
  6. JS对象迭代、事件处理器、表单控件绑定、表单复选框、表单单选按钮
  7. 微信群发机器人源代码
  8. android加载本地图片
  9. c语言保留三位小数用float,float保留三位小数
  10. 精选了20个Python实战项目(附源码)
  11. 推荐给大家一个网络工程标书模版(仅供参考)
  12. mysql 求几何平均值_回忆高中数学--各种平均数公式
  13. 海马玩模拟器离线安装包下载方法
  14. 微信小程序开发笔记(一)
  15. git 提交报错 Incorrect username or password ( access token )
  16. 如何使用ANSYS workbench导出最清晰的图的步骤
  17. 深入浅出MySQL-学习笔记by CZF
  18. 博图买什么样配置的笔记本_西门子PLC编程软件-博图软件用什么配置的电脑最好?...
  19. 【图像分类】2022-CMT CVPR
  20. <会说话是本事>的记录文摘

热门文章

  1. 智能垃圾桶(十二)——电路图软件fritzing+raspberry pi pico(树莓派pico)
  2. Java分布式应用技术架构介绍
  3. 中国地质大学武汉计算机学院吴越,中国地质大学(武汉)计算机学院“大学生开放创新实验室”授牌仪式顺利举行...
  4. 基于Arduino的迷你电子琴
  5. 画图分析Dual Attention(CAM、PAM)、non-local、CCNet、Relation-Aware Global Attention关系矩阵的具体含义--附代码)
  6. Maven编译 Fatal error compiling: 无效的目标发行版: 11
  7. 拓邦新能上市申请获创业板受理:毛利率持续下降,张震华为大股东
  8. golang 导出excel表格的两个包使用对比
  9. RabbitMQ SSl安全认证流程
  10. 多级分销模块 java_java B2B2C 源码 多级分销Springcloud多租户电子商城系统- 整合企业架构的技术点(二)...