android 在线获取音乐歌词lrc文件

出自: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 plain  copy
  1.   
[java]  view plain  copy
  1. "code" class="java">  
[java]  view plain  copy
  1. "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.   
  7.     
  8.         android:id="@+id/et_song"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="倔强"  
  12.         />  
  13.       
  14.     
  15.         android:layout_below="@id/et_song"  
  16.         android:id="@+id/et_singer"  
  17.         android:layout_width="match_parent"  
  18.         android:layout_height="wrap_content"  
  19.         android:text="五月天"  
  20.          />  
  21.       
  22.     
  23.         android:layout_below="@id/et_singer"  
  24.         android:id="@+id/bt_submit"  
  25.         android:layout_width="match_parent"  
  26.         android:layout_height="wrap_content"  
  27.         android:text="提交"  
  28.         />  
  29.       
  30.     
  31.         android:layout_below="@id/bt_submit"  
  32.         android:layout_width="match_parent"  
  33.         android:layout_height="wrap_content"  
  34.         >  
  35.     
  36.         
  37.         android:id="@+id/tv_show"  
  38.         android:layout_width="match_parent"  
  39.         android:layout_height="match_parent"  
  40.         android:text="暂无数据"  
  41.         />  
  42.       
  43.   
  44.   


MainActivity

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



 

android 在线获取音乐歌词lrc文件_第1张图片

android 在线获取音乐歌词lrc文件_第2张图片




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


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

看连接  你发现通过你的搜索 可以得到 如下链接  android 在线获取音乐歌词lrc文件_第3张图片


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

android 在线获取音乐歌词lrc文件_第4张图片


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

你可能感兴趣的:(Android)