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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android Studio中显示LRC歌词文件,可以按照以下步骤进行操作: 1.在布局文件中添加一个TextView,用于显示歌词。 2.在Java代码中读取LRC文件并将其解析为Map,其中键为时间戳,值为歌词文本。 3.在MediaPlayer的OnPreparedListener中启动一个线程,该线程将定期更新TextView以显示当前播放时间的歌词。 下面是一个简单的示例代码,可以帮助你实现这个功能: ```java // 在布局文件中添加一个TextView,用于显示歌词 TextView lrcTextView = findViewById(R.id.lrcTextView); // 在Java代码中读取LRC文件并将其解析为Map Map<Long, String> lrcMap = new HashMap<>(); try { BufferedReader br = new BufferedReader(new FileReader(lrcFile)); String line; while ((line = br.readLine()) ! null) { Matcher matcher = Pattern.compile("\\[(\\d{2}):(\\d{2})\\.(\\d{2})\\](.*)").matcher(line); if (matcher.find()) { long time = Long.parseLong(matcher.group(1)) * 60 * 1000 + Long.parseLong(matcher.group(2)) * 1000 + Long.parseLong(matcher.group(3)) * 10; String text = matcher.group(4); lrcMap.put(time, text); } } br.close(); } catch (IOException e) { e.printStackTrace(); } // 在MediaPlayer的OnPreparedListener中启动一个线程,该线程将定期更新TextView以显示当前播放时间的歌词 MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { new Thread(new Runnable() { @Override public void run() { while (mediaPlayer.isPlaying()) { long time = mediaPlayer.getCurrentPosition(); if (lrcMap.containsKey(time)) { runOnUiThread(new Runnable() { @Override public void run() { lrcTextView.setText(lrcMap.get(time)); } }); } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }); // 播放音乐 mediaPlayer.setDataSource(audioFile); mediaPlayer.prepare(); mediaPlayer.start(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值