很久没来了 昨天公司 年会 简直无情 左边两个 右边两个 对面一个 都中奖了 我最平衡了 心都碎了 回来之后 暗下决心 还是好好敲代码吧 人品不行 就好好学习 做了一个在线获取歌词lrc的 demo 因为最近在做一款音乐播放器 有用到 就分享下 其实主要就是接口难找 我这个接口也不怎么好 有些歌曲也搜不到歌词第一个链接格式 http://box.zhangmen.baidu.com/x?op=12&count=1&title=%E5%80%94%E5%BC%BA$$%E4%BA%94%E6%9C%88%E5%A4%A9$$$$%E5%80%94%E5%BC%BA
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$$%E4%BA%94%E6%9C%88%E5%A4%A9$$$$
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好就可以获取 这个网站的歌词 哪位知道可以告诉下我 大家一起学习哈。。。