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

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. Linq读取XML数据

    1.XML数据格式:<?xml version="1.0"?><customers>  <customer>    <id>ALFK ...

  2. 10、bitmap格式分析

    说到图片,位图(Bitmap)当然是最简单的,它Windows显示图片的基本格式,其文件扩展名为*.BMP.在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图个时候才能显示出来,各种 ...

  3. 几款用jQuery写的h5小游戏

    人人都说前端用来做游戏是一件很困难的事情,遇到这些js的逻辑性问题,是不是有点懵?其实,做完一款游戏之后就会发现,没啥难的地方,差不多都是换汤不换药,作为爱玩游戏的我,也总结收集了几款比较流行的小软件 ...

  4. [Angular2 Router] Resolving route data in Angular 2

    From Article: RESOLVING ROUTE DATA IN ANGULAR 2 Github If you know Anuglar UI router, you must know ...

  5. ConcurrentLinkedQueue使用方法

    它是一个基于链接节点的无界线程安全队列.该队列的元素遵循先进先出的原则.头是最先加入的,尾是最近加入的. 插入元素是追加到尾上.提取一个元素是从头提取.当多个线程共享访问一个公共 collection ...

  6. 【codeforces 742C】Arpa's loud Owf and Mehrdad's evil plan

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  7. jquery pagination分页的两种实现方式

    原文链接:http://blog.csdn.net/qq_37936542/article/details/79457012 此插件是jQuery的ajax分页插件.如果你用到此插件作分页的时候,涉及 ...

  8. 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照

    本文主要介绍String类.StringBuffer类.StringBuilder类的差别  : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...

  9. JAVA类(下)

    我看完了Java类,与C++相比,复杂了一点.其中有类的嵌套定义即内部类,枚举类等. 我看这两节花了我很多时间.其中有一些概念还是有点难懂. 下面,我详细总结内部类与枚举类. 内部类 内部类的主要作用 ...

  10. .net core 下使用StackExchange的Redis库访问超时解决

    原文:.net core 下使用StackExchange的Redis库访问超时解决 目录 问题:并发稍微多的情况下Redis偶尔返回超时 给出了参考网址? 结论 小备注 引用链接 问题:并发稍微多的 ...