出自:http://blog.csdn.net/liubo20140401/article/details/43342875

在线获取歌词lrc的 demo 因为最近在做一款音乐播放器 有用到 就分享下 其实主要就是接口难找 我这个接口也不怎么好 有些歌曲也搜不到歌词第一个链接格式 http://box.zhangmen.baidu.com/x?op=12&count=1&title=%E5%80%94%E5%BC%BA

$$%E5%80%94%E5%BC%BA
这种东西肯定是编码了的 所以上面的基本就是这个样子 
走一次 
发现是XML 其中发现一个节点 lrcid 再根据 这个lrcid节点 去另一个接口 
获取lrc文件 XML

[java] view plaincopy
  1. </pre><pre>
[java] view plaincopy
  1. </pre><pre name="code" class="java">
[java] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. >
  6. <EditText
  7. android:id="@+id/et_song"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="倔强"
  11. />
  12. <EditText
  13. android:layout_below="@id/et_song"
  14. android:id="@+id/et_singer"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:text="五月天"
  18. />
  19. <Button
  20. android:layout_below="@id/et_singer"
  21. android:id="@+id/bt_submit"
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:text="提交"
  25. />
  26. <ScrollView
  27. android:layout_below="@id/bt_submit"
  28. android:layout_width="match_parent"
  29. android:layout_height="wrap_content"
  30. >
  31. <TextView
  32. android:id="@+id/tv_show"
  33. android:layout_width="match_parent"
  34. android:layout_height="match_parent"
  35. android:text="暂无数据"
  36. />
  37. </ScrollView>
  38. </RelativeLayout>

MainActivity

[java] view plaincopy
  1. package com.example.getlrconline;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.FileNotFoundException;
  8. import java.io.FileOutputStream;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. import java.io.InputStreamReader;
  12. import java.io.OutputStreamWriter;
  13. import java.io.UnsupportedEncodingException;
  14. import java.net.HttpURLConnection;
  15. import java.net.URL;
  16. import java.net.URLEncoder;
  17. import org.xmlpull.v1.XmlPullParser;
  18. import android.support.v7.app.ActionBarActivity;
  19. import android.os.Bundle;
  20. import android.os.Environment;
  21. import android.os.Handler;
  22. import android.os.Message;
  23. import android.util.Log;
  24. import android.util.Xml;
  25. import android.view.Menu;
  26. import android.view.MenuItem;
  27. import android.view.View;
  28. import android.view.View.OnClickListener;
  29. import android.widget.Button;
  30. import android.widget.EditText;
  31. import android.widget.TextView;
  32. import android.widget.Toast;
  33. public class MainActivity extends ActionBarActivity {
  34. private String et_singer_str;
  35. private String et_song_str;
  36. private String get_id_url;
  37. private EditText et_singer;
  38. private EditText et_song;
  39. private Button bt_submit;
  40. private TextView tv_show;
  41. private String result_xml;
  42. private String baseUrl = Environment.getExternalStorageDirectory()
  43. + "/dting/lrc/";
  44. Handler handler = new Handler() {
  45. public void handleMessage(Message msg) {
  46. switch (msg.what) {
  47. case 1:
  48. if ("".equals(result_xml)){
  49. tv_show.setText("未获取歌词");
  50. }
  51. else {
  52. getLrcByLrcId();
  53. }
  54. break;
  55. case 2:
  56. // 读取本地保存的 歌词
  57. String path = baseUrl + et_singer_str + "-" + et_song_str
  58. + ".lrc";
  59. String lrc_content = getString4Local(path);
  60. if ("".equals(lrc_content)) {
  61. tv_show.setText("没有获取到歌词");
  62. } else {
  63. tv_show.setText(lrc_content);
  64. }
  65. break;
  66. default:
  67. break;
  68. }
  69. }
  70. /**
  71. * 获取lrc文件
  72. */
  73. private void getLrcByLrcId() {
  74. tv_show.setText(result_xml);
  75. // 得到 id 开始获取 歌词文件 下载到地址地方 /dting/lrc/XXX.lrc
  76. String end_path = Integer.parseInt(result_xml) / 100 + "/"
  77. + result_xml + ".lrc";
  78. get_lrc_url = get_lrc_url + end_path;
  79. // 开始获取 lrc
  80. new Thread(new Runnable() {
  81. @Override
  82. public void run() {
  83. try {
  84. boolean isOk_getLrc = requestByGet(get_lrc_url,
  85. baseUrl, et_singer_str + "-"
  86. + et_song_str + ".lrc");
  87. if (isOk_getLrc) {
  88. Message msg = Message.obtain();
  89. msg.what = 2;
  90. handler.sendMessage(msg);
  91. }
  92. } catch (Exception e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. }).start();
  97. };
  98. };
  99. private String get_lrc_url;
  100. @Override
  101. protected void onCreate(Bundle savedInstanceState) {
  102. super.onCreate(savedInstanceState);
  103. setContentView(R.layout.activity_main);
  104. et_singer = (EditText) findViewById(R.id.et_singer);
  105. et_song = (EditText) findViewById(R.id.et_song);
  106. bt_submit = (Button) findViewById(R.id.bt_submit);
  107. tv_show = (TextView) findViewById(R.id.tv_show);
  108. // http://box.zhangmen.baidu.com/x?op=12&count=1&title=
  109. // %E5%80%94%E5%BC%BA $$
  110. bt_submit.setOnClickListener(new OnClickListener() {
  111. @Override
  112. public void onClick(View v) {
  113. result_xml="";
  114. et_singer_str = et_singer.getText().toString();
  115. et_song_str = et_song.getText().toString();
  116. get_id_url = "http://box.zhangmen.baidu.com/x?op=12&count=1&title=";
  117. get_lrc_url = "http://box.zhangmen.baidu.com/bdlrc/";
  118. if (("".equals(et_singer_str) || null == et_singer_str)
  119. || ("".equals(et_song_str) || null == et_song_str)) {
  120. Toast.makeText(getApplicationContext(), "填入信息", 0).show();
  121. return;
  122. }
  123. try {
  124. String name = URLEncoder.encode(et_song_str, "utf-8");
  125. String singer = URLEncoder.encode(et_singer_str, "utf-8");
  126. get_id_url = get_id_url + name + "$$" + singer + " ";
  127. new Thread(new Runnable() {
  128. @Override
  129. public void run() {
  130. // 根据这个地址 得到xml 解析 xml
  131. try {
  132. result_xml = requestByGet_xml(get_id_url);
  133. System.out.println("发送id " +result_xml);
  134. Message msg = Message.obtain();
  135. msg.what = 1;
  136. handler.sendMessage(msg);
  137. } catch (Exception e) {
  138. e.printStackTrace();
  139. }
  140. }
  141. }).start();
  142. } catch (UnsupportedEncodingException e) {
  143. e.printStackTrace();
  144. } catch (Exception e) {
  145. e.printStackTrace();
  146. }
  147. }
  148. });
  149. }
  150. /**
  151. * 本地读取歌词文件
  152. * @param path
  153. */
  154. protected String getString4Local(String path) {
  155. try {
  156. InputStream in = new FileInputStream(new File(path));
  157. ByteArrayOutputStream os = new ByteArrayOutputStream();
  158. byte[] buffer = new byte[1024];
  159. int len = -1;
  160. while ((len = in.read(buffer)) != -1) {
  161. os.write(buffer, 0, len);
  162. }
  163. return os.toString("gbk");    //文件编码是GBK的
  164. } catch (FileNotFoundException e) {
  165. e.printStackTrace();
  166. } catch (IOException e) {
  167. e.printStackTrace();
  168. }
  169. return "";
  170. }
  171. // Get方式请求
  172. /**
  173. * 解析XMl
  174. * @param path
  175. * @return
  176. * @throws Exception
  177. */
  178. public  String requestByGet_xml(String path) throws Exception {
  179. URL url = new URL(path);
  180. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
  181. urlConn.setConnectTimeout(5 * 1000);
  182. urlConn.connect();
  183. String id = "";
  184. XmlPullParser xmlParser = Xml.newPullParser();
  185. // 判断请求是否成功
  186. if (urlConn.getResponseCode() == 200) {
  187. // 获取响应的输入流对象
  188. InputStream is = urlConn.getInputStream();
  189. String itemElement = "lrcid";  //要获取的节点name
  190. XmlPullParser xmlPullParser = Xml.newPullParser();
  191. xmlPullParser.setInput(is, "UTF-8");
  192. int event = xmlPullParser.getEventType();
  193. while (event != XmlPullParser.END_DOCUMENT) {
  194. switch (event) {
  195. case XmlPullParser.START_TAG:
  196. if (itemElement.equals(xmlPullParser.getName())) {
  197. id = xmlPullParser.nextText();
  198. }
  199. break;
  200. case XmlPullParser.END_TAG:
  201. if (itemElement.equals(xmlPullParser.getName())) {
  202. }
  203. break;
  204. }
  205. if ("".equals(id) || null == id) {
  206. event = xmlPullParser.next();
  207. } else {
  208. break;
  209. }
  210. }
  211. urlConn.disconnect();
  212. }
  213. return id;
  214. }
  215. // Get方式请求
  216. /**
  217. * 得到lrc文件下载本地
  218. * @param path
  219. * @param save_path
  220. * @param filename
  221. * @return
  222. * @throws Exception
  223. */
  224. public boolean requestByGet(String path, String save_path, String filename)
  225. throws Exception {
  226. URL url = new URL(path);
  227. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
  228. urlConn.setConnectTimeout(5 * 1000);
  229. urlConn.connect();
  230. // 判断请求是否成功
  231. if (urlConn.getResponseCode() == 200) {
  232. // 获取响应的输入流对象
  233. InputStream is = urlConn.getInputStream();
  234. File file1 = new File(save_path);
  235. if (!file1.exists()) {
  236. file1.mkdirs();
  237. }
  238. File file = new File(save_path + filename);
  239. InputStreamReader isr=new InputStreamReader(is, "gbk");
  240. BufferedReader br=new BufferedReader(isr);
  241. FileOutputStream out = new FileOutputStream(file);
  242. OutputStreamWriter  osw=new OutputStreamWriter(out, "gbk");
  243. BufferedWriter bw=new BufferedWriter(osw);
  244. String ss="";
  245. while ((ss=br.readLine())!=null) {
  246. bw.write(ss);
  247. bw.newLine();
  248. }
  249. // 释放资          i
  250. bw.close();
  251. br.close();
  252. urlConn.disconnect();
  253. return true;
  254. } else {
  255. Log.i("GET", "Get方式请求失败");
  256. }
  257. // 关闭连接
  258. urlConn.disconnect();
  259. return false;
  260. }
  261. @Override
  262. public boolean onCreateOptionsMenu(Menu menu) {
  263. // Inflate the menu; this adds items to the action bar if it is present.
  264. getMenuInflater().inflate(R.menu.main, menu);
  265. return true;
  266. }
  267. @Override
  268. public boolean onOptionsItemSelected(MenuItem item) {
  269. // Handle action bar item clicks here. The action bar will
  270. // automatically handle clicks on the Home/Up button, so long
  271. // as you specify a parent activity in AndroidManifest.xml.
  272. int id = item.getItemId();
  273. if (id == R.id.action_settings) {
  274. return true;
  275. }
  276. return super.onOptionsItemSelected(item);
  277. }
  278. }

 






有必要说一下 我试过 有些能获取到 有些不能获取到  其实 这样的话  也可以处理 多找几个免费的api接口 第一个没获取 就进入第二个  依次  要是全没获取 那就只有自己搭建了 毕竟免费的不多 资源肯定也有限 


另外还说一下我找到一个 挺好的歌词很多的 但是 不怎么会获取 比如这一个

看连接  你发现通过你的搜索 可以得到 如下链接  


这个只能是 根据歌曲名单独搜索 不能歌曲名加歌手 这样一来 如上所述 有多个  而且 主要是要拿我那个 小太阳所指向的那个链接  http://www.bzmtv.com/geci/276/119119.html  也就是这个链接  不知道如何获取 能获取这个 就可以获取歌词了 因为 如下



看到了 那个 lrc文件 我复制 链接 直接进去 是可以下载的  难点就是  怎么根据我搜索的歌名 获取某个歌手的 那首歌词的连接 http://www.bzmtv.com/geci/276/119119.html   276/119119好就可以获取 这个网站的歌词  哪位知道可以告诉下我  大家一起学习哈。。。

android 在线获取音乐歌词lrc文件相关推荐

  1. Android漂亮的音乐歌词控件,仿网易云音乐滑动效果

    前言: 项目有个音乐播发器功能,实现音乐在线播放,同时需要带有歌词显示功能.网上也找过,在github找到勉强能用的控件,只是效果还是差强人意,不是特别好.于是趁有空的时间,参考了网上的部分demo, ...

  2. android在线播放音乐

    2019独角兽企业重金招聘Python工程师标准>>> android在线音乐 一种方法是调用android自带的播放器 //调用系统自带播放器Intent intent = new ...

  3. android 完美获取音乐文件中的专辑图片并显示

    其实实现音乐中的专辑图像提取是相当的容易的,网上大多的资料都是比较扯淡的,其实就几行代码而已. 看下面代码之前,我们所要做的工作是通过mediaplayer已经获取到了音乐文件中的诸多信息: Medi ...

  4. android在线查询音乐,Android 数据抓取——在线音乐播放器的实现

    前言: 相信很多同学学习android都开做过播放器一类的小玩意吧,但是苦于没有服务器提供数据,因而只能做个本地播放器,今天,这篇文章就是通过数据抓取,实现没有服务器,依然可以在线搜索和播放音乐! 首 ...

  5. android 音乐歌词接口,Android自定义View--仿QQ音乐歌词

    0.前言 国庆长假,祝大家节日愉快,这个控件其实是上周五写的,以前写代码一直都是信马由缰,无拘无束,但是最近开始注重时间和效率,喜欢限时编程,今天这个控件用了4个小时...远超当初预订的2个半小时,主 ...

  6. android锁屏音乐歌词的实现,在锁屏界面显示 Apple Music 的歌词

    Apple Music 一直以来的一个缺点就是歌词.不只是缺少歌词,还有歌词的显示.没有滚动歌词,也不能在锁屏界面显示.当然其他播放器的锁屏显示功能在 iOS 11 通知中心改版时也挂掉了.但是这个需 ...

  7. android文件夹隐藏,Android – 快速获取隐藏图像和文件夹的方法

    我正在添加另一个答案 快速闪电 : – 在我的测试应用程序中以134微秒执行扫描. 使用ContentResolver : – 使用ContentResolver扫描包含.noMedia文件的所有隐藏 ...

  8. 用批处理整理百度MP3上歌曲排行榜MP3及LRC文件的批量下载链接地址(含图文教程)

    http://bbs.wuyou.com/viewthread.php?tid=192322 本文结构如下: 一.缘起:问题的提出 二.试探:徒劳而返 三.峰回路转:芝麻!开门! 四.万事俱备:xml ...

  9. html怎么读取lrc文件,lrc文件怎么打开?lrc是什么文件?

    lrc文件怎么打开?lrc是什么文件? lrc是歌词 文件的扩展名,一般用记事本打开. 关于lrc是什么文件?lrc是英文lyric(歌词)的缩写,被用做歌词文件的扩展名.以lrc为扩展名的歌词文件可 ...

  10. Android之获取地理位置

    Android之获取地理位置 权限 // 清单文件中配置 <uses-permission android:name="android.permission.ACCESS_FINE_L ...

最新文章

  1. fpga驱动步进电机转动指定角度_【硬见小百科】步进电机工作原理及实现方法...
  2. Tensorflow利用函数修饰符@tf.custom_gradients自定义函数梯度
  3. linux下新建一个脚本文件,linux下新建并启动脚本文件
  4. 设计海报|字符海报怎么玩?
  5. hashcode()和equals()的区别
  6. UI设计之不同抠图工具的使用技巧
  7. CentOS 7 安装EOS 并启动钱包
  8. 埋葬了我曾经的执着与思恋题记不过是所谓的世界末日
  9. 社区人物志|缪翎:见证开源世界的女性力量
  10. hadoop面试题 5 ---有用
  11. 更换cpu后 unraid 无法启动web,提示PTE Read access is not set
  12. IE6,IE7和firefox的兼容问题大集合
  13. VSCode操作小技巧
  14. [笑语天下]风景、照片与评论古今
  15. c#中如何用codesoft来打印标签开发分享
  16. oracle环境配置全过程
  17. 简单解决高分屏模糊问题
  18. 内存和CPU匹配方法详解
  19. 【学术相关】读博士读得想退学?怎么办?
  20. 生死狙击2等待服务器响应,《生死狙击2》劫掠测试结束:热爱不止 来日再战!...

热门文章

  1. mysql 导出dmp文件_Oracle导入导出dmp文件
  2. iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果
  3. 计算机运行但屏幕黑屏,电脑显示器黑屏,教您电脑主机运行正常显示器黑屏怎么办...
  4. 居家第二十六天烤鸡翅
  5. 金三银四:蚂蚁金服JAVA后端面试题及答案之二面
  6. springboot基于微信小程序的校园体育运动场地及器材租凭系统设计与实现毕业设计源码131052
  7. 怎样用计算机弹虫儿飞,吉他初学者必看:虫儿飞指弹教程
  8. 答题拿奖两不误:华为云知乎金牌答题官,就是你!
  9. gitlab安装配置
  10. C语言编程 - 推箱子小游戏源码分享 (含过关)