出自:http://blog.youkuaiyun.com/liubo20140401/article/details/43342875
在线获取歌词lrc的 demo 因为最近在做一款音乐播放器 有用到 就分享下 其实主要就是接口难找 我这个接口也不怎么好 有些歌曲也搜不到歌词第一个链接格式 http://box.zhangmen.baidu.com/x?op=12&count=1&title=%E5%80%94%E5%BC%BA
这种东西肯定是编码了的 所以上面的基本就是这个样子
走一次
发现是XML 其中发现一个节点 lrcid 再根据 这个lrcid节点 去另一个接口
获取lrc文件 XML
- </pre><pre>
- </pre><pre name="code" class="java">
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <EditText
- android:id="@+id/et_song"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="倔强"
- />
- <EditText
- android:layout_below="@id/et_song"
- android:id="@+id/et_singer"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="五月天"
- />
- <Button
- android:layout_below="@id/et_singer"
- android:id="@+id/bt_submit"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="提交"
- />
- <ScrollView
- android:layout_below="@id/bt_submit"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <TextView
- android:id="@+id/tv_show"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:text="暂无数据"
- />
- </ScrollView>
- </RelativeLayout>
MainActivity
- package com.example.getlrconline;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.net.URLEncoder;
- import org.xmlpull.v1.XmlPullParser;
- import android.support.v7.app.ActionBarActivity;
- import android.os.Bundle;
- import android.os.Environment;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- import android.util.Xml;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity extends ActionBarActivity {
- private String et_singer_str;
- private String et_song_str;
- private String get_id_url;
- private EditText et_singer;
- private EditText et_song;
- private Button bt_submit;
- private TextView tv_show;
- private String result_xml;
- private String baseUrl = Environment.getExternalStorageDirectory()
- + "/dting/lrc/";
- Handler handler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case 1:
- if ("".equals(result_xml)){
- tv_show.setText("未获取歌词");
- }
- else {
- getLrcByLrcId();
- }
- break;
- case 2:
- // 读取本地保存的 歌词
- String path = baseUrl + et_singer_str + "-" + et_song_str
- + ".lrc";
- String lrc_content = getString4Local(path);
- if ("".equals(lrc_content)) {
- tv_show.setText("没有获取到歌词");
- } else {
- tv_show.setText(lrc_content);
- }
- break;
- default:
- break;
- }
- }
- /**
- * 获取lrc文件
- */
- private void getLrcByLrcId() {
- tv_show.setText(result_xml);
- // 得到 id 开始获取 歌词文件 下载到地址地方 /dting/lrc/XXX.lrc
- String end_path = Integer.parseInt(result_xml) / 100 + "/"
- + result_xml + ".lrc";
- get_lrc_url = get_lrc_url + end_path;
- // 开始获取 lrc
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- boolean isOk_getLrc = requestByGet(get_lrc_url,
- baseUrl, et_singer_str + "-"
- + et_song_str + ".lrc");
- if (isOk_getLrc) {
- Message msg = Message.obtain();
- msg.what = 2;
- handler.sendMessage(msg);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }).start();
- };
- };
- private String get_lrc_url;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- et_singer = (EditText) findViewById(R.id.et_singer);
- et_song = (EditText) findViewById(R.id.et_song);
- bt_submit = (Button) findViewById(R.id.bt_submit);
- tv_show = (TextView) findViewById(R.id.tv_show);
- // http://box.zhangmen.baidu.com/x?op=12&count=1&title=
- // %E5%80%94%E5%BC%BA
- bt_submit.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- result_xml="";
- et_singer_str = et_singer.getText().toString();
- et_song_str = et_song.getText().toString();
- get_id_url = "http://box.zhangmen.baidu.com/x?op=12&count=1&title=";
- get_lrc_url = "http://box.zhangmen.baidu.com/bdlrc/";
- if (("".equals(et_singer_str) || null == et_singer_str)
- || ("".equals(et_song_str) || null == et_song_str)) {
- Toast.makeText(getApplicationContext(), "填入信息", 0).show();
- return;
- }
- try {
- String name = URLEncoder.encode(et_song_str, "utf-8");
- String singer = URLEncoder.encode(et_singer_str, "utf-8");
- get_id_url = get_id_url + name + "$$" + singer + "
- new Thread(new Runnable() {
- @Override
- public void run() {
- // 根据这个地址 得到xml 解析 xml
- try {
- result_xml = requestByGet_xml(get_id_url);
- System.out.println("发送id " +result_xml);
- Message msg = Message.obtain();
- msg.what = 1;
- handler.sendMessage(msg);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }).start();
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- }
- /**
- * 本地读取歌词文件
- * @param path
- */
- protected String getString4Local(String path) {
- try {
- InputStream in = new FileInputStream(new File(path));
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len = -1;
- while ((len = in.read(buffer)) != -1) {
- os.write(buffer, 0, len);
- }
- return os.toString("gbk"); //文件编码是GBK的
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "";
- }
- // Get方式请求
- /**
- * 解析XMl
- * @param path
- * @return
- * @throws Exception
- */
- public String requestByGet_xml(String path) throws Exception {
- URL url = new URL(path);
- HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
- urlConn.setConnectTimeout(5 * 1000);
- urlConn.connect();
- String id = "";
- XmlPullParser xmlParser = Xml.newPullParser();
- // 判断请求是否成功
- if (urlConn.getResponseCode() == 200) {
- // 获取响应的输入流对象
- InputStream is = urlConn.getInputStream();
- String itemElement = "lrcid"; //要获取的节点name
- XmlPullParser xmlPullParser = Xml.newPullParser();
- xmlPullParser.setInput(is, "UTF-8");
- int event = xmlPullParser.getEventType();
- while (event != XmlPullParser.END_DOCUMENT) {
- switch (event) {
- case XmlPullParser.START_TAG:
- if (itemElement.equals(xmlPullParser.getName())) {
- id = xmlPullParser.nextText();
- }
- break;
- case XmlPullParser.END_TAG:
- if (itemElement.equals(xmlPullParser.getName())) {
- }
- break;
- }
- if ("".equals(id) || null == id) {
- event = xmlPullParser.next();
- } else {
- break;
- }
- }
- urlConn.disconnect();
- }
- return id;
- }
- // Get方式请求
- /**
- * 得到lrc文件下载本地
- * @param path
- * @param save_path
- * @param filename
- * @return
- * @throws Exception
- */
- public boolean requestByGet(String path, String save_path, String filename)
- throws Exception {
- URL url = new URL(path);
- HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
- urlConn.setConnectTimeout(5 * 1000);
- urlConn.connect();
- // 判断请求是否成功
- if (urlConn.getResponseCode() == 200) {
- // 获取响应的输入流对象
- InputStream is = urlConn.getInputStream();
- File file1 = new File(save_path);
- if (!file1.exists()) {
- file1.mkdirs();
- }
- File file = new File(save_path + filename);
- InputStreamReader isr=new InputStreamReader(is, "gbk");
- BufferedReader br=new BufferedReader(isr);
- FileOutputStream out = new FileOutputStream(file);
- OutputStreamWriter osw=new OutputStreamWriter(out, "gbk");
- BufferedWriter bw=new BufferedWriter(osw);
- String ss="";
- while ((ss=br.readLine())!=null) {
- bw.write(ss);
- bw.newLine();
- }
- // 释放资 i
- bw.close();
- br.close();
- urlConn.disconnect();
- return true;
- } else {
- Log.i("GET", "Get方式请求失败");
- }
- // 关闭连接
- urlConn.disconnect();
- return false;
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- if (id == R.id.action_settings) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
- }
有必要说一下 我试过 有些能获取到 有些不能获取到 其实 这样的话 也可以处理 多找几个免费的api接口 第一个没获取 就进入第二个 依次 要是全没获取 那就只有自己搭建了 毕竟免费的不多 资源肯定也有限
另外还说一下我找到一个 挺好的歌词很多的 但是 不怎么会获取 比如这一个
看连接 你发现通过你的搜索 可以得到 如下链接
这个只能是 根据歌曲名单独搜索 不能歌曲名加歌手 这样一来 如上所述 有多个 而且 主要是要拿我那个 小太阳所指向的那个链接 http://www.bzmtv.com/geci/276/119119.html 也就是这个链接 不知道如何获取 能获取这个 就可以获取歌词了 因为 如下
看到了 那个 lrc文件 我复制 链接 直接进去 是可以下载的 难点就是 怎么根据我搜索的歌名 获取某个歌手的 那首歌词的连接 http://www.bzmtv.com/geci/276/119119.html 276/119119好就可以获取 这个网站的歌词 哪位知道可以告诉下我 大家一起学习哈。。。