在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773。假设没有本地歌词怎么办?如今来将一下载入在线歌词。好了,还是用那张图。

在实现这个功能的时候,lz尝试过baidu api,歌词迷api,后来选用了歌词迷api。尽管还是资源不全。并且还有非常多错误。

特别头疼的是有时候歌词竟然不分行。解析起来简直难受。

歌词迷api歌词查询地址:http://geci.me/api/lyric/

比方我要查询:   http://geci.me/api/lyric/安静/周杰伦

会得到一下json串:

  1. {"count": 2, "code": 0, "result": [{"aid": 2223011, "artist_id": 30796, "song": "\u5b89\u9759", "lrc": "http://s.geci.me/lrc/257/25700/2570058.lrc", "sid": 2570058}, {"aid": 2336033, "artist_id": 30796, "song": "\u5b89\u9759", "lrc": "http://s.geci.me/lrc/272/27282/2728244.lrc", "sid": 2728244}]}

非常easy发现里面的歌词文件。然后缓冲到本地(SweetMusicPlayer/Lryics)下,再按本地载入的方式即可了。

捋一捋,我们载入歌词文件要经过下面步骤。

1)通过地址查询出歌词的地址。

(这里楼主用URLConnection)

2)通过歌词地址缓冲歌词文件。

(这里楼主用URLConnection)

3)载入缓冲好的歌词文件。

上面说的看起来还是比較easy,楼主自己写了个demo,是一个javaproject,发现没啥问题。正常载入歌词文件。

等到android上,第一步就跪了。发现URLConnection的getInputStream()抛出一个io异常,简直要命。折腾了半天才发现是由于带了http://geci.me/api/lyric/安静/周杰伦中文路径。

由于默认是gbk,网络传输为utf-8,所以要把中文转码。URLEncoder.encode(str,"utf-8");就可以。

到了第2步,问题又出现了,歌词乱码。

解决的方法,用字符流操作比較合适,还要注意同一编码。

  1. package com.huwei.sweetmusicplayer.util;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.File;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.io.OutputStreamWriter;
  10. import java.io.PrintWriter;
  11. import java.io.UnsupportedEncodingException;
  12. import java.net.HttpURLConnection;
  13. import java.net.MalformedURLException;
  14. import java.net.URL;
  15. import java.net.URLConnection;
  16. import java.net.URLEncoder;
  17. import java.util.Random;
  18.  
  19. import org.json.JSONArray;
  20. import org.json.JSONException;
  21. import org.json.JSONObject;
  22.  
  23. import android.os.Environment;
  24. import android.util.Log;
  25.  
  26. public class OnlineLrcUtil {
  27. private static String TAG = "OnlineLrcUtil";
  28. private static OnlineLrcUtil instance;
  29. public static final String lrcRootPath = Environment
  30. .getExternalStorageDirectory().toString()
  31. + "/SweetMusicPlayer/Lyrics/";
  32.  
  33. public static final String queryLrcURLRoot = "http://geci.me/api/lyric/";
  34.  
  35. public static OnlineLrcUtil getInstance() {
  36. if (null == instance) {
  37. instance = new OnlineLrcUtil();
  38. }
  39.  
  40. return instance;
  41. }
  42.  
  43. public String getQueryLrcURL(String title, String artist) {
  44. return queryLrcURLRoot + Encode(title) + "/" + Encode(artist);
  45. }
  46.  
  47. public String getLrcURL(String title, String artist) {
  48. String queryLrcURLStr = getQueryLrcURL(title, artist);
  49. try {
  50. URL url = new URL(queryLrcURLStr);
  51. URLConnection urlConnection = url.openConnection();
  52. urlConnection.connect();
  53.  
  54. BufferedReader in = new BufferedReader(new InputStreamReader(
  55. urlConnection.getInputStream()));
  56.  
  57. StringBuffer sb = new StringBuffer();
  58.  
  59. String temp;
  60. while ((temp = in.readLine()) != null) {
  61. sb.append(temp);
  62. }
  63.  
  64. JSONObject jObject = new JSONObject(sb.toString());
  65. int count = jObject.getInt("count");
  66. int index = count == 0 ? 0 : new Random().nextInt() % count;
  67. JSONArray jArray = jObject.getJSONArray("result");
  68. JSONObject obj = jArray.getJSONObject(index);
  69. return obj.getString("lrc");
  70.  
  71. } catch (MalformedURLException e) {
  72. // TODO Auto-generated catch block
  73. e.printStackTrace();
  74. } catch (IOException e) {
  75. // TODO Auto-generated catch block
  76. e.printStackTrace();
  77. } catch (JSONException e) {
  78. // TODO Auto-generated catch block
  79. e.printStackTrace();
  80. }
  81.  
  82. return null;
  83. }
  84.  
  85. // 歌手,歌曲名中的空格进行转码
  86. public String Encode(String str) {
  87.  
  88. try {
  89. return URLEncoder.encode(str.trim(), "utf-8");
  90. } catch (UnsupportedEncodingException e) {
  91. // TODO Auto-generated catch block
  92. e.printStackTrace();
  93. }
  94.  
  95. return str;
  96.  
  97. }
  98.  
  99. // 歌词文件网络地址,歌词文件本地缓冲地址
  100. public boolean wrtieContentFromUrl(String urlPath, String lrcPath) {
  101. Log.i(TAG, "lrcURL" + urlPath);
  102.  
  103. try {
  104. URL url = new URL(urlPath);
  105.  
  106. URLConnection urlConnection = url.openConnection();
  107. urlConnection.connect();
  108.  
  109. HttpURLConnection httpConn = (HttpURLConnection) urlConnection;
  110. if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
  111. File file = new File(lrcRootPath);
  112. if (!file.exists()) {
  113. file.mkdirs();
  114. }
  115.  
  116. BufferedReader bf = new BufferedReader(new InputStreamReader(
  117. urlConnection.getInputStream(), "utf-8"));
  118. PrintWriter out = new PrintWriter(new BufferedWriter(
  119. new OutputStreamWriter(new FileOutputStream(lrcPath),
  120. "utf-8")));
  121.  
  122. char c[] = new char[256];
  123. int temp = -1;
  124. while ((temp = bf.read()) != -1) {
  125. bf.read(c);
  126. out.write(c);
  127. }
  128.  
  129. bf.close();
  130. out.close();
  131.  
  132. return true;
  133. }
  134.  
  135. // System.out.println("getFile:"+str);
  136. } catch (MalformedURLException e) {
  137. // TODO Auto-generated catch block
  138. e.printStackTrace();
  139. } catch (IOException e) {
  140. // TODO Auto-generated catch block
  141. e.printStackTrace();
  142. }
  143.  
  144. return false;
  145. }
  146.  
  147. public String getLrcPath(String title, String artist) {
  148. return lrcRootPath + title + " - " + artist + ".lrc";
  149. }
  150. }

下一篇摇一摇切歌:http://blog.csdn.net/huweigoodboy/article/details/39880779

版权声明:本文博客原创文章,博客,未经同意,不得转载。

android音乐播放器开发 SweetMusicPlayer 智能负载直插式歌词的更多相关文章

  1. android音乐播放器开发 SweetMusicPlayer 智能匹配本地歌词

    上一篇写了使用MediaPlayer播放音乐,http://blog.csdn.net/huweigoodboy/article/details/39861539. 代码地址:https://gith ...

  2. android音乐播放器开发 SweetMusicPlayer 播放本地音乐

    上一篇写了载入歌曲列表,http://blog.csdn.net/huweigoodboy/article/details/39856411,如今来总结下播放本地音乐. 一,MediaPlayer 首 ...

  3. android音乐播放器开发 SweetMusicPlayer 实现思路

    一,实现效果 眼下还不是特别完好,主要有下面几个功能, 1,载入歌曲列表(实现a-z字母检索) 2,播放本地音乐 3.智能匹配本地歌词 4.智能载入在线歌词(事实上不算智能.发现歌词迷api提供的歌词 ...

  4. android音乐播放器开发 SweetMusicPlayer 载入歌曲列表

    上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https: ...

  5. android音乐播放器开发 SweetMusicPlayer 摇一摇换歌

    上一篇写了怎样在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,如今来讲讲摇一摇功能开发. 相同用了一个Service ...

  6. android音乐播放器开发教程

    android音乐播放器开发教程 Android扫描sd卡和系统文件 Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能 android操作sdcard中的多媒体文件——音乐列表 ...

  7. Android音乐播放器开发

    今日看书,看到这个播放器,我就写了个例子,感觉还行,这个播放器能播放后缀是.MP3的音乐,这个例子在main.xml设置listView的时候,注意:android:id="@+id/and ...

  8. Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)

    一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...

  9. 一款非常简单的android音乐播放器源码分享给大家

    一款非常简单的android音乐播放器源码分享给大家,该应用虽然很小,大家常用的播放器功能基本实现了,可能有点还不够完善,大家也可以自己完善一下,源码在源码天堂那里已经有了,大家可以到那里下载学习吧. ...

随机推荐

  1. 编写高性能Javascript

    编写高性能Javascript 多年来,Javascript一直在web应用开发中占据重要的地位,但是很多开发者往往忽视一些性能方面的知识,特别是随着计算机硬件的不断升级,开发者越发觉得Javascr ...

  2. JSON序列化那点事儿

    JSON序列化那点事儿 序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScri ...

  3. Cocos2d-X中的坐标系

    在Cocos2d-x中坐标能够分成四种: 1.GL坐标体系:GL坐标体系左下角为坐标原点,X轴向右,Y轴向上 2.UI坐标体系:UI坐标体系左上角为坐标原点,X轴向右,Y轴向上. .世界坐标体系:是窗 ...

  4. 选择一个利于SEO的空间

    大家好.今天蜗牛将给大家分享怎么选择一个利于SEO的站点空间. 一.什么是站点空间? 站点空间,是用来存你的站点的HTML,.图片.文件等的一个远程硬盘空间(就像你的电脑里面的空间一回事儿).依据不同 ...

  5. 在SurfaceView中自由书写和擦除

    /////////继承SurfaceView 的类 public class PaintView extends SurfaceView implements Runnable,SurfaceHold ...

  6. Unity模拟龙之谷人物行走简单控制

    我个人挺喜欢龙之谷(DN)的人物控制的(不是广告哈....),就是人物太萌了一点,动作.打击感都挺好的. 今天用Unity简单模仿了一下DN的人物控制,当然,游戏里面动作非常多,我这里仅仅做了简单的w ...

  7. @using (Html.BeginForm())参数示例

    原文:@using (Html.BeginForm())参数示例 1.指定表单提交方式和路径等 @using (Html.BeginForm("Index", "Home ...

  8. Codeforces 374D Inna and Sequence 二分法+树状数组

    主题链接:点击打开链接 特定n一个操作,m长序列a 下列n的数量 if(co>=0)向字符串加入一个co (開始是空字符串) else 删除字符串中有a的下标的字符 直接在序列上搞.简单模拟 # ...

  9. 如何让格斗游戏的横版过关(2) Cocos2d-x 2.0.4

    在第一章<如何使横版格戏>基础上.添加角色运动.碰撞.敌人.AI和音乐音效,原文<How To Make A Side-Scrolling Beat 'Em Up Game Like ...

  10. UVA 10537 - The Toll! Revisited(dijstra扩张)

    UVA 10537 - The Toll! Revisited option=com_onlinejudge&Itemid=8&page=show_problem&catego ...