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


很久没来了 昨天公司 年会 简直无情 左边两个 右边两个 对面一个 都中奖了 我最平衡了 心都碎了 回来之后 暗下决心 还是好好敲代码吧 人品不行 就好好学习 做了一个在线获取歌词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
这种东西肯定是编码了的 所以上面的基本就是这个样子
走一次
发现是XML 其中发现一个节点 lrcid 再根据 这个lrcid节点 去另一个接口
获取lrc文件 XML
 
  
 
  


    
    
    
    
    


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好就可以获取 这个网站的歌词  哪位知道可以告诉下我  大家一起学习哈。。。

你可能感兴趣的:(Android)