android 在线获取音乐歌词lrc文件
来源:互联网 发布:铅弹在淘宝怎么淘 编辑:程序博客网 时间:2024/04/29 18:23
很久没来了 昨天公司 年会 简直无情 左边两个 右边两个 对面一个 都中奖了 我最平衡了 心都碎了 回来之后 暗下决心 还是好好敲代码吧 人品不行 就好好学习 做了一个在线获取歌词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
这种东西肯定是编码了的 所以上面的基本就是这个样子
走一次
发现是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.lrcString end_path = Integer.parseInt(result_xml) / 100 + "/"+ result_xml + ".lrc";get_lrc_url = get_lrc_url + end_path;// 开始获取 lrcnew Thread(new Runnable() {@Overridepublic 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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic void run() {// 根据这个地址 得到xml 解析 xmltry {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"; //要获取的节点nameXmlPullParser 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();}// 释放资ibw.close();br.close();urlConn.disconnect();return true;} else {Log.i("GET", "Get方式请求失败");}// 关闭连接urlConn.disconnect();return false;}@Overridepublic 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;}@Overridepublic 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好就可以获取 这个网站的歌词 哪位知道可以告诉下我 大家一起学习哈。。。
1 0
- android 在线获取音乐歌词lrc文件
- android 在线获取音乐歌词lrc文件
- android 音乐播放器-------歌词同步 lrc
- Android音乐播放器读取歌词.lrc文件乱码问题解决方法
- android MusicPlayer 音乐播放器 Lrc歌词控件的实现
- lrc歌词文件
- 音乐播放器(1)--在线歌词获取
- android 音乐播放器----歌词在线下载
- android 音乐播放器----歌词在线下载
- android 音乐播放器----歌词在线下载
- 怎样制作Lrc歌词文件
- C++ 分析歌词(LRC)文件
- android中解析lrc歌词
- Android mp3音乐播放器实例----------lrc歌词处理相关类
- android音乐播放器开发 SweetMusicPlayer 智能加载在线歌词
- android音乐播放器开发在线加载歌词
- LRC歌词
- 《菊花台》的歌词LRC文件
- CSS+JS实现同一页面可以重复使用的选项卡
- java多线程
- dive into python (2)
- 安卓各种资源介绍及使用方法及工程各文件夹的介绍
- 替换空格
- android 在线获取音乐歌词lrc文件
- android开发之SlidingMenu侧滑菜单栏之使用
- Apache OFBiz源码解读之MVC模型
- Linux显示检查设置文件中的语法是否正确
- 线程编程之浅尝辄止1
- 登陆模板JS增加验证码
- ubuntu eclipse 一写代码就崩溃
- 金额转换成大写
- Linux显示服务器完整的状态信息