首先,你必须通过以下连接下载歌曲:

http://box.zhangmen.baidu.com/x?op=12&count=1&title={title}$${author}$$$$

能够获取一个xml文件通过解析xml文件就能够读取到音乐下载的地址和歌词下载的地址。

部分代码:

String title = "六月的雨";

  String singer = "胡歌";                    

  String url = "http://box.zhangmen.baidu.com/x?op=12&count=1&title={title}$${author}$$$$"

  url=url.replace("{title}", URLEncoder.encode(title, "utf-8"));    

   //将String字符串转码

  if(singer == null) {

url=url.replace("$${author}$$$$", "");

 }else {

url=url.replace("{author}", URLEncoder.encode(singer, "utf-8"));

 }

以下这部分是依据url地址,下载xml文件的代码:

public static InputStream downLoad(String urlStr) {  
//依据网络地址获取输入流

InputStream inputStream = null;

    try {

    URL url = new URL(urlStr);

    HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();

    urlConn.setRequestMethod("GET");

    urlConn.setConnectTimeout(10000);

    urlConn.setDoOutput(true);

    urlConn.setDoInput(true);

    //urlConn.setUseCaches(true);

    urlConn.connect();

    System.out.println("UrlCode:"+urlConn.getResponseCode());

    if(urlConn.getResponseCode() != HttpURLConnection.HTTP_OK) {

    System.out.println("请求失败");

    }else {

    System.out.println("请求成功  ");

    }

    inputStream = urlConn.getInputStream();

    }catch(Exception e) {

    e.printStackTrace();

    }

    return inputStream;

   }

public static String downLoadTextFile(String url) {              

StringBuffer sb = new StringBuffer();

BufferedReader buffer = null;

InputStream instream = null;

String line=null;

try {

instream = downLoad(url);

buffer = new BufferedReader(new InputStreamReader(instream,"GB2312"));

while((line = buffer.readLine()) != null){

System.out.println(line);

sb.append(line+"\n");

}

}catch(IOException e) {

e.printStackTrace();

}finally {

try {

buffer.close();

instream.close();

}catch(IOException e) {

e.printStackTrace();

}

}

return sb.toString();

}

下载的XML文件例如以下:

<<result>

<count>1</count>

<url>

<encode>

<![CDATA[

http://zhangmenshiting.baidu.com/data2/music/35447544/ZGdnaGxra2xfn6NndK6ap5WXcJppZ2ppZ2aWaWaXnWthlJSWmphucGJklZaWmJiakmlplpZuZ5xkaZZramdtbGFmbFqin5t1YWBnamVtcGhpaGhpa21rcTE$

]]>

</encode>

<decode>

<![CDATA[

35447544.mp3?xcode=f413164c51af30babeb7812bbababa76ba80d37c75164049&mid=0.46079086556749

]]>

</decode>

<type>8</type>

<lrcid></lrcid>

<flag>1</flag>

</url>

<durl>

<encode>

<![CDATA[

http://zhangmenshiting2.baidu.com/data2/music/35447547/ZGdnaGxra29fn6NndK6ap5WXcJppZ2ppZ2aWaWaXnWthlJSWmphucGJklZaWmJiakmlpZZaYZ2pnY2xobm1wbpOTaFqin5t1YWBnamVtcGhpaGhpa21rcTE$

]]>

</encode>

<decode>

<![CDATA[

35447547.mp3?

xcode=f413164c51af30babeb7812bbababa761ab0261949796ba5&mid=0.46079086556749

]]>

</decode>

<type>8</type>

<lrcid>35220</lrcid>

<flag>1</flag>

</durl>

<p2p>

<hash>9d1c20c4d3055f25acb6b61d727cafcfae096519</hash>

<url>

<![CDATA[ ]]>

</url>

<type>mp3</type>

<size>5511091</size>

<bitrate>192</bitrate>

</p2p>

</result>

当中的count值为1是说返回的是一个,,encode里的值是歌曲加密后的地址,加密仅仅是对文件名称加密
的,

我们须要的仅仅是前面的路径,也就是 http://zhangmenshiting.baidu.com/data2/music/35447544/

这部分,然后复制decode 的值:

35447544.mp3?

xcode=f413164c51af30babeb7812bbababa76ba80d37c75164049&mid=0.46079086556749

把他们连接起来就是mp3的url下载地址:

http://zhangmenshiting.baidu.com/data2/music/35447544/35447544.mp3?xcode=f413164c51af30babeb7812bbababa76ba80d37c75164049&mid=0.46079086556749

http://box.zhangmen.baidu.com/bdlrc/
这个是百度lrc歌词存放地址,

xml中的lrcid就是地址可是要把它转换一下。首先

35220/100 =352.20 取小于等于352.20 的最大整数就是352,于是这首歌完整的歌词地址就出来了:

/.lrc

这部分也是网上看到的,能够到网上查到的。好像就是这么个规则

以下是解析XML文件:

//使用dom解析xml文件

public static String parasXML(InputStream inputStream) {

try {

String lrcid = null,url = null;

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document dom = builder.parse(inputStream);

Element root =  dom.getDocumentElement();

Node count = root.getFirstChild();

NodeList items = root.getElementsByTagName("url");

if(items.getLength() <= 0) {

System.out.println("歌曲未找到");

return null;

}else {

Element urlNode = (Element)items.item(0);

//System.out.println(urlNode.getTextContent());

Element lrcidNode = (Element)(urlNode.getElementsByTagName("lrcid").item(0));

Element encodeNode = (Element)urlNode.getElementsByTagName("encode").item(0);

Element decodeNode = (Element)urlNode.getElementsByTagName("decode").item(0);

if(encodeNode == null) {

System.out.println("歌曲信息为空,无法下载");

return null;

}else {

System.out.println("encode="+encodeNode.getTextContent());

}

if(lrcidNode == null) {

System.out.println("lrcid == null");

}else {

System.out.println(lrcidNode.getNodeName());

}

if("lrcid".equals(lrcidNode.getNodeName())) {

System.out.println(lrcidNode.getTextContent());

lrcid = lrcidNode.getTextContent();

}else {

System.out.println(lrcidNode.getNodeName());

}

//获取encode里的值

String temp1 = encodeNode.getTextContent();   

//获取decodeNode的值

String temp2 = decodeNode.getTextContent();                                   

StringBuffer buffer = new StringBuffer();



//接下来是将temp1和temp2进行切割解码合并在一起

String [] arrayTemp1 = temp1.split("/"); 

for(int i=0;i<arrayTemp1.length-1;i++) {

buffer.append(arrayTemp1[i]+"/");

}

//把解码的地址合在一起

buffer.append(temp2);                                                    

url = buffer.toString();

url = url + "##"+ lrcid;

System.out.println("xml:url="+url);

return url;

}

}catch(Exception e) {

e.printStackTrace();

return null;

}

}

后面就能够通过##来分开url和lrcid的值从而获取对应的值

下载文件的就能够先获取InputStream然后通过这个流接口获取对应的值

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Android获取百度音乐下载音乐和歌词下载链接的更多相关文章

  1. Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)

    Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...

  2. 模仿《百度音乐HD》添加到下载框动画

    上次听有人说喜欢<百度音乐HD>添加到下载动画 ,我就尝试模仿了下,没想到,今天code4app(地址)也有了这个,但是 这个动画基本相同,我们的思路还是部一样的. 都可以参考 .主要关键 ...

  3. QQ音乐2019客户端-获取任意歌单完整歌曲列表和下载音乐文件方法

    步骤 1.在web网站上搜搜任意歌单 https://y.qq.com/#type=index/ 例如:中国好声音4.5.6.7.8季 打开后显示网址:  https://y.qq.com/n/yqq ...

  4. android快捷简单的实现音乐播放器

    自己做了一个相对完整的音乐播放器,现在把播放模块提取出来,分享给大家.音乐播放器基本功能都实现了的,可能有些BUG,希望谅解. 播放器功能如下: 1.暂停,播放 2.拖动条实现,快进,快退 3.歌词同 ...

  5. Android应用--简、美音乐播放器增加音量控制

    Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...

  6. C# WPF 低仿网易云音乐(PC)歌词控件

    原文:C# WPF 低仿网易云音乐(PC)歌词控件 提醒:本篇博客记录了修改的过程,废话比较多,需要项目源码和看演示效果的直接拉到文章最底部~ 网易云音乐获取歌词的api地址 http://music ...

  7. Python爬虫全网搜索并下载音乐

    现在写一篇博客总是喜欢先谈需求或者本内容的应用场景,是的,如果写出来的东西没有任何应用价值,确实也没有实际意义.今天的最早的需求是来自于如何免费[白嫖]下载全网优质音乐,我去b站上面搜索到了一个大牛做 ...

  8. Android命令行播放MP3音乐

    /*************************************************************************** * Android命令行播放MP3音乐 * 说 ...

  9. Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用

     Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...

随机推荐

  1. [Angular2 Form] Angular 2 Template Driven Form Custom Validator

    In this tutorial we are going to learn how we can also implement custom form field validation in Ang ...

  2. View的事件分发机制解析

    引言 Android事件构成 在Android中,事件主要包含点按.长按.拖拽.滑动等,点按又包含单击和双击,另外还包含单指操作和多指操作.全部这些都构成了Android中的事件响应.总的来说.全部的 ...

  3. hadoop配置文件的加载机制 分类: A1_HADOOP 2015-01-21 11:29 839人阅读 评论(0) 收藏

    hadoop通过Configuration类来保存配置信息 1.通过Configuration.addResource()来加载配置文件 2.通过Configuration.get***()来获取配置 ...

  4. js进阶 12-2 彻底弄懂JS的事件冒泡和事件捕获

    js进阶 12-2 彻底弄懂JS的事件冒泡和事件捕获 一.总结 一句话总结:他们是描述事件触发时序问题的术语.事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件.相反的,事件 ...

  5. Behavioral模式之Memento模式

    1.意图 在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. 2.别名 Token 3.动机 有时候有必要记录一个对象的内部状态.为 ...

  6. Write Code As If You Had to Support It for the Rest of Your Life

    Write Code As If You Had to Support It for the Rest of Your Life Yuriy Zubarev YOU COULD ASK 97 PEOP ...

  7. [React] Use React Context to Manage Application State Through Routes

    We’ll create a Router component that will wrap our application and manage all URL related state. We’ ...

  8. 公布一个基于CSDN Code的学习測试仓库

    使用CSDN Code代码托管平台有一段时间了,今天新建立了一个公开的仓库https://code.csdn.net/smstong/learngit/tree/master,供大家測试合并请求等协作 ...

  9. Expression Blend 的点滴(2)--利用可视化状态创建神奇翻转动画

    原文:Expression Blend 的点滴(2)--利用可视化状态创建神奇翻转动画 首先,来看下实现后的效果: 关于VisulaState VisualState 指定控件处于特定状态时的外观.例 ...

  10. Oracle数据库零散知识09 -- DBLink的创建(转)

    通过创建database link实现Oracle跨数据库查询的方法 在Oracle本地数据库端执行赋权dbuser帐号 SQL> grant create database link to d ...