用百度MP3的API从网络下载歌曲的完整实现

百度翻译MP3下载便捷插件的开发技术详解 浏览器扩展程序是一组额外的代码和资源,它们可以被浏览器安装以改变或增强浏览器的默认功能。与传统的插件不同,扩展通常不涉及安装外部软件,而是直接嵌入在浏览器内部。Chrome扩展允许开发者实现各种高级功能,如:自定义右键菜单拦截和修改网络请求同步数据到云端使用Native应用程序接口执行复杂的用户界面操作这些功能极大地增强了扩展的可用性和用户体验。 阅读详情

自从学Android以来,我一直都在写一点东西,虽然说不大但是还挺有成就感的。每当在手机上运行自己的程序时,感觉虽然真的挺烂的,但是那种喜悦感不知道大家能不能理解。

我一直上心的一个程序就是音乐播放器,这是我第一个可以拿得出手的程序,虽然说现在还是很烂,但是也要看和什么比较了,能实现基本的功能也算是一个优点了吧。一开始我只是简单的能够播放本地的程序,只是一个简单的ListView的运用,不支持歌词,也不能从网络获取歌词,甚至读取歌曲文件都是从指定目录下获取。但是,我没办法啊,当时学的太少,渐渐的学的多了,我也就在不断补充内容进去。我可以支持歌词显示了,我不甘心于本地读取歌词,看了大量的资料之后,我能从网络下载歌词了,不甘心于本地歌曲,终于,我能从网络下载歌曲了,这个过程可能漫长了一点,但是最后还是实现了,有点被自己感动了,O(∩_∩)O哈哈~,说的有点多了,好了,进入正题吧!

从网络获取歌曲资源,本来就不是多么简单的事,需要对XML有一定的了解,不光是了解,还要会使用,当然也可以不用了解,因为封装的足够好的话,别人的东西可以直接使用,这也是不错的方法。

从头开始说,我想获取歌曲资源就需要接口,从百度找了好长的时间,我大概看了有20篇的博客,让我吃惊的事情是居然有2/3的博客内容是一模一样的,对,一模一样,他们都是给出了百度MP3的API借口,但是怎么用呢,下面就没有解释了,我不知道他们是不了解还是没时间写博客,但是直接Copy别人博客的内容,我个人感觉还是不好的,而且他们给的内容根本没法让你使用,只是告诉了你有这个API的存在,怎么用还真没有,当然我也不会说什么,但是,最后还真让我找到了对这个API的使用,真的是很全面,从一开始的介绍,到最后的运用,我可以说我是看了那个博客才学会下载歌曲的,它对我帮助很大!出于感谢和尊重,我把地址放在这里,大家可以去看一下:

http://blog.youkuaiyun.com/yutengwan/article/details/30220705
好了,话就说到这里,下面我将一下怎么实现下载歌曲,尽我所能把大家给教会^_^。

效果图如下:

输入歌曲名称和歌手,然后我们就可以下载了。

"http://box.zhangmen.baidu.com/x?op=12&count=1&title={title}$${author}$$$$"
这就是百度mp3的API了,在我看过的80%的博客里,都会有这一个API。这个API使用的时候,我们需要把{title}换成歌曲名称,{author}换成歌手,然后就可以去获取URL了。我写了一个工具类来使用,方便转换。

public class Utils {
	public static String ToURL(String title,String author) {
		String url = "http://box.zhangmen.baidu.com/x?op=12&count=1&title={title}$${author}$$$$";
		try {
			url = url.replace("{title}", URLEncoder.encode(title, "utf-8"));
			url=url.replace("{author}", URLEncoder.encode(author, "utf-8"));
		} catch (Exception e) {}
		return url;
	}
}


从这个类中定义的方法,我们只需要传入如效果图中EditText中的名称和歌手,然后就可以得到URL了。但是这个URL并不是可以直接下载歌曲的,因为它所表示并不是歌曲,而是一个XML文件,XML文件里面所保存的才是我们需要的URL,根据这个URL我们就可以下载歌曲了。

下面是根据URL得到的XML里面的内容:

”http://box.zhangmen.baidu.com/x?op=12&count=1&title=幻听$$许嵩$$$$“

<result>
<count>1</count>
<url>
<encode>
<![CDATA[
http://zhangmenshiting.baidu.com/data2/music/40455198/ZWJnaWpncHBfn6NndK6ap5WXcGdpZmduZGRjaW6anWhilWyXm5dom5dllGqabJmeaJiWlWZqZ5thlmyVbmqcbJdrZFqin5t1YWBoZG1nbmtiY2RqZ2xscTE$
]]>
</encode>
<decode>
<![CDATA[
40455198.mp3?xcode=3400632059df01c9cfa1cf3a6e6bf7fca140c0d9a94e4f91&mid=0.50817311162659
]]>
</decode>
<type>8</type>
<lrcid>1069339</lrcid>
<flag>1</flag>
</url>
<durl>
<encode>
<![CDATA[
http://zhangmenshiting2.baidu.com/data2/music/40455208/ZWJnaWpoZ3Bfn6NndK6ap5WXcGdpZmduZGRjaW6anWhilWyXm5dom5dllGqabJmeaJiWl22baXFnaJRobmiYcZRql1qin5t1YWBoZG1nbmtiY2RqZ2xscTE$
]]>
</encode>
<decode>
<![CDATA[
40455208.mp3?xcode=3400632059df01c9cfa1cf3a6e6bf7fcc8e2966a492a9c8d&mid=0.50817311162659
]]>
</decode>
<type>8</type>
<lrcid>1069339</lrcid>
<flag>1</flag>
</durl>
<p2p>
<hash>7abcd427ab364a7cdfe6bfbce11dc90d97dc8c87</hash>
<url>
<![CDATA[ ]]>
</url>
<type>mp3</type>
<size>6613349</size>
<bitrate>192</bitrate>
</p2p>
</result>


http://zhangmenshiting2.baidu.com/data2/music/40455198/40455198.mp3

这一部分就是我们需要获取的东西,所以我们就需要对XML文件进行解析,所以我才说大家需要对XML有一定的了解和使用,不然使用起来还是很痛苦的,因为不明白。但是,大家还是不需要担心,因为在前话我说了,不懂没关系,因为我给大家封装好了,大家直接使用就可以了,当然如果大家想了解,大家可以对我的代码进行仔细研究,相信大家可以明白的。如果还是存在不明白的地方,欢迎大家和我交流。

public class Main {
	public static InputStream downLoad(String urlPath){
		InputStream inputStream = null;
		try {
			URL url = new URL(urlPath);
			HttpURLConnection urlCon =  (HttpURLConnection) url.openConnection();
			urlCon.setRequestMethod("GET");
			urlCon.setConnectTimeout(10000);
			urlCon.setDoOutput(true);
			urlCon.setDoInput(true);
			urlCon.setAllowUserInteraction(true);
			urlCon.connect();
			inputStream = urlCon.getInputStream();
		} catch (Exception e ){}
		return inputStream;
	}
	 public 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){
				 sb.append(line+"\n");
			 }
		 }catch(Exception e) {}
		 try {
			 buffer.close();
			 instream.close();
		 }catch(Exception e) {}
		 return sb.toString();
	}
	 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) {
				 return null;
			 }else {
			 Element urlNode = (Element)items.item(0);
			 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) {
		    	 return null;
		     }
		     if("lrcid".equals(lrcidNode.getNodeName())) {
		    	 lrcid = lrcidNode.getTextContent();
		     }else {
		     }
		     //获取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;
		     return url;
			 }
		 }catch(Exception e) {
		 	e.printStackTrace();
		 	return null;
		 }
	}
}

在这个类里面,我提供了三个方法,不过我们只需要使用两个就可以了。

方法一:

public static InputStream downLoad(String urlPath);

这个方法是根据我们用Utility工具类中获得的URL来获得一个InputStream的对象,这个对象是一个输入流,它是和XML文件连在一起的,根据这个对象,我们就可以解析XML文件。


方法二:

public String downLoadTextFile(String url);

这个方法是将XML文件里面的内容保存到一个字符串中,我们根据这个字符串我们就可以知道XML文件里有什么内容了,但是我们在实现的时候并不需要这个方法,只是在程序出问题的时候我们可以用来调试XML里面是不是包含我们需要的URL罢了。


方法三:

public static String parasXML(InputStream inputStream);

这个方法可以说是最重要的了,因为它返回的就是我们所需要的URL字符串了,根据这个字符串,我们就可以生成URL对象,有了URL对象,想干什么还不是由你说了算嘛。

好了,大家大概对如何根据歌曲名称和歌手获得歌曲的URL有一定的了解了,只需要把我所提供的类运用在自己的项目中就可以直接使用了,如何根据url来下载资源,这个就是另一个问题了,也就是获取网络资源的问题,这个问题问题相对就比较简单了,大家从网上可以找到相关的博客看一看,当然我也会更新一个新的博客,大家可以期待了。还有很重要的一点,大家在获取URL的时候,对上面的几个方法的使用,一定要在一个新的线程中使用,不能在主线程中使用,因为Android不允许你在主线程中进行和网络相关的操作,你只能新建一个线程,在这个线程中进行操作,不然,到时候你是怎么错的你都不知道,我可是被坑过的人啊。

下载源码




NbsApi:用于读取和写入音符块歌曲(.nbs文件)的API NbsApi 用于读取和写入音符块歌曲(.nbs文件)的API。 这是一个正在开发的API,用于读取和写入可在David's 使用的Note Block Song文件(.nbs)。 您可以使用它来读取和写入.nbs文件,而无需使用自定义工具(当前)。 Javadoc可以在找到。 警告:如与此存储库相关的MIT许可中所述,使用此API需您自担风险。 对于此API可能造成的任何损坏或问题,我将不予答复。 但是您可以在“问题”部分报告错误。 立即下载

相关推荐

S32K1XX Autosar开发实战|全网独家复现EB MCAL Port/Dio配置、详解引脚分层原理、实现经典跑马灯助力车载IO电控落地

在NXP S32K1XX系列车规MCU的AUTOSAR标准开发体系中,MCAL(微控制器抽象层)是软硬件解耦的核心载体,而Port端口模块与Dio数字IO模块是MCAL最基础、最核心的入门模块,也是车载指示灯、按键检测、继电器驱动、外设硬件启停控制的底层支撑。区别于传统裸机直接操作寄存器的开发方式,AUTOSAR架构采用分层隔离设计,Port负责硬件静态初始化、Dio负责动态电平操控,严格遵循车规级开发规范,杜绝硬件资源冲突、引脚配置混乱等问题。

getusushu的博客 43

音乐API调用以及分析(以酷狗音乐为例)

音乐排行榜列表: 接口地址: http://m.kugou.com/rank/list&json=true 请求方式:Get 返回数据:(这里本编使用只截取了5条数据) { "JS_CSS_DATE": 20130320, "kg_domain": "http://m.kugou.com", "...

颤动的小胖纸 2万+

【调优】OpenClaw从零开始高阶调优之skill篇

本文详细解析了OpenClaw技能系统的核心机制。首先介绍了技能的分层加载逻辑,按照优先级从高到低依次为:工作区专属技能、全局共享技能、出厂自带技能和自定义路径技能。通过流程图展示了从扫描到注册的完整加载流程,并解释了同名技能覆盖规则。随后深入剖析了SKILL.md文件结构,包含YAML元数据定义技能属性和Markdown正文说明使用方法,以公众号写作技能为例展示了具体配置。文章还提供了技能优先级切换的实用技巧,帮助用户灵活管理不同版本的技能。

海兰 239

API是什么意思,具体是什么?

API,其实就是别人已经写好的可以实现特定功能的函数,而你只需要根据他提供好的接口,也就是调用他的方法,传入他规定的参数,然后这个函数就会帮你实现这些功能,大概就是空手套白狼的意思,不然你也可以自己完成这些功能,但是这就很困难了,因为有时你需要了解很多的原理等等,如果你不是规则制定者,那么就好好使用这些接口,最后你牛的话也可以自己来提供api给别人用,成为别人口中的大神。当然你现在还不明白的话,你...

weixin_41357609的博客 1万+

大学计算 - NumPy库的矩阵运算 实训答案

本文介绍了三个NumPy矩阵操作的实验练习。第一关练习ndarray类型操作,包括矩阵构造、元素平方和计算、矩阵乘积运算和逆矩阵行列式计算;第二关针对matrix类型,涉及绝对值最大值获取、特定矩阵乘积运算和转置矩阵特征值计算;第三关实现Moore-Penrose伪逆矩阵计算,并与NumPy内置pinv函数结果比较误差。实验涵盖了NumPy核心矩阵操作,展示了从基础运算到高级矩阵分解的应用,帮助掌握科学计算中的矩阵处理技巧。

2403_89314916的博客 310

板蓝根挥发油微胶囊化技术及其在抗菌织物整理中的应用研究

微胶囊技术是一种通过成膜材料将具有反应活性或挥发性的液体或固体包封成微小颗粒的技术。该技术因其优异的缓释保护和物态改变性能,已在医药、食品、化妆品等多个领域得到广泛应用。本研究采用复凝聚法制备板蓝根挥发油的微胶囊,利用明胶和阿拉伯胶作为壁材,旨在提升其稳定性和抗菌性能。

qq_62634009的博客 584

网易云音乐API接口

csrf_token=hlpretag=&hlposttag=&s=(输入音乐名称)&type=1&offset=0&total=true&limit=2。csrf_token=hlpretag=&hlposttag=&s=孤勇者&type=1&offset=0&total=true&limit=2。请求参数:id(查询关键字)

AXQ_1314的博客 1万+

【WRF安装】完整自动化 WRF-ARW/WRF-Chem 安装脚本(多服务器测试)

【WRF安装】完整自动化 WRF-ARW/WRF-Chem 安装脚本(多服务器测试)

WW、forever的博客 285

百度mp3接口(baidu mp3 api)

特别说明:文章转载http://mrasong.com/a/baidu-mp3-api 1、通过关键词,获取列表。 http://mp3.baidu.com/dev/api/?tn=getinfo&ct=0&ie=utf-8&word=&format= 参数:     word: "歌曲名", //歌曲名 encodeURI     format: "json", //返

Donny的专栏 3149

实战:RK3568 Android14 点亮 LVDS 屏幕

4组数据 (D0~D3) + 1组时钟 (CLK)。最大支持 1280x800 @ 60Hz。8组数据 (Even03, Odd03) + 2组时钟。支持 1080P 及以上。/ {/* 背光与电源 *//** 关键配置:数据格式映射* 可选值: "jeida-18", "jeida-24", "vesa-24"* 6位屏选 xx-18, 8位屏选 xx-24* 颜色不对(偏色/底片效果)就换 VESA <-> JEIDA*/

qq_33427070的博客 1165

StarRC:版本陈旧引发的多corner提取RC失败

运行StarRC提取多corner RC时会遇到提取失败的情况,当分次提取各个corner RC时却成功了,这种时候优先考虑nxtgrd版本陈旧的情况。解决办法是找到nxtgrd对应的itf文件,然后使用新版starrc去产生nxtgrd。debug方法也简单,在运行StarRC开始阶段会报告如下信息,就证明nxtgrd太老了。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1830

从MP3中提取歌曲信息(C#) 选择自 ufoer23 的 Blog

从MP3中提取歌曲信息(C#)     选择自 ufoer23 的 Blog  关键字   从MP3中提取歌曲信息(C#) 出处      从MP3中提取歌曲信息  作者:game.19xz 来源:19xz.com  从MP3中提取歌曲信息        一首MP3歌曲除了音乐信息外,还包含了如歌名、演唱者等信息,当我们用winamp软件听音乐时,播放清单就自动将这些信息读出来。大部分人都喜欢从...

weixin_33882452的博客 192

ROS与Qt5人机交互界面开发:添加rviz显示界面

最后,点击"完成"以创建新的Qt5应用程序项目。通过结合ROS和Qt5,您可以创建强大的人机交互界面,以实现丰富的机器人控制和数据可视化。在本教程中,我们将在主窗口中创建一个简单的按钮,用于启动rviz显示界面。在Qt Creator的槽函数编辑器中,为按钮添加一个槽函数,该函数将在单击按钮时调用。在上面的代码中,我们使用QProcess类启动了一个新的进程,并执行"rviz"命令来启动rviz显示界面。当您单击Qt5应用程序中的按钮时,将会启动一个新的rviz窗口,显示机器人数据的可视化界面。

CodeJolt的博客 2067

获取网络上歌曲下载链接

最近做了一个demo,可以根据百度mp3接口获取歌曲的链接。在做的过程中,参考了以下两篇博文,写的很不错。 http://mrasong.com/a/baidu-mp3-api百度mp3接口 http://mrasong.com/a/baidu-mp3-api-full[新]百度mp3接口 下面附上我的demo: class Music{ //只获取其中一条数据返回 //$q

zuimei_forver的博客 980

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

百度MP3音乐API接口及应用

 最近在做一个播放器的项目,要实现从网络下载歌曲和歌词,看了很多别人的帖子和博客,今天上午终于搞定,也来总结一下,希望能帮助大家,好了,不说废话了,进入正题。 百度提供了一个开放音乐搜索的api,在浏览器的地址栏输入: http://box.zhangmen.baidu.com/x?op=12&count=1&title=歌名$$歌手 其中歌名和歌手两个字段值需要经过utf-8编码

jyqqhw_41的专栏 691

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python之——爬取千千静听(百度音乐)歌曲

还是直接上代码吧: #!/usr/bin/env python # -*- coding: utf-8 -*- # -*- coding: gbk -*- # Date: 2019/7/15 # Created by 冰河 # Description # 博客 https://blog.youkuaiyun.com/l1028386804 import requests import pprint i...

冰河的专栏 3022

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

android 百度音乐 api,[新]百度mp3接口(baidu mp3 api)

做了一个demo,可以下载百度的flac格式音频,无需会员。源码:baidu-music-api-demo.tar.gzhttp://tingapi.ting.baidu.com/v1/restserver/ting?from=webapp_music&method=baidu.ting.search.catalogSug&format=json&callback=&amp...

weixin_39603995的博客 685

爬去百度音乐的歌曲,突破不能点播的限制,将其下载。

百度音乐因为限制有些歌曲不能点播,譬如上图的所有歌曲……但其实它们都在百度里隐藏着, 但是我们可以根据其他能点播的歌曲,如林志炫的“单身情歌”,找到规律,从而下载下来。 下面说下整体思路: 1.通过在搜索框里输入“林志炫”得到其歌单界面,点击“单身情歌”的播放按钮会跳转到新页面; 2.在新页面里的network里寻找media的mp3的url,可以发送get请求返回二进制,下载到本地,...

jiangerchi的博客 629

[Linux C]百度音乐API实现在线搜歌

最近在做科大讯飞的语音解析模块,主要用于语音控制播放。采集语音输入后,送给科大讯飞语音的SDK,云服务器返回JSON的数据,再解析拿到URL地址,最后送给播放器去播放。不知是否是尚未上线的product,申请的appid,解析JSON后拿到的URL地址,歌曲播放的时间都很短,一般不到1分钟。一番网络搜索后,据说百度有个未公开的搜歌API,只要拿到歌手和歌曲名,就可以传给这个URL,然后百度就会回你一

Timsley的专栏 2726

用批处理整理百度MP3上歌曲排行榜MP3及LRC文件的批量下载链接地址(含图文教程)

http://bbs.wuyou.com/viewthread.php?tid=192322 本文结构如下: 一、缘起:问题的提出 二、试探:徒劳而返 三、峰回路转:芝麻!开门! 四、万事俱备:xml文件里的玄机 五、临阵换将:curl还是wget? 六、下载,我喜欢批量的:如何用迅雷批量下载mp3? 七、收网:从百度M

张同光 (Tongguang Zhang):Hello everyone ! 3682

百度音乐盒API接口及扩展应用

做一个播放器的项目,要实现从网络下载歌曲和歌词,看了很多别人的帖子和博客,今天上午终于搞定,也来总结一下,希望能帮助大家,好了,不说废话了,进入正题。 百度提供了一个开放音乐搜索的api,在浏览器的地址栏输入: http://box.zhangmen.baidu.com/x?op=12&count=1&title=歌名$$歌手 其中歌名和歌手两个字段值需要经过utf-

成长的味道 1748

Java 语音合成并播放(百度语音API)

系列文章: Java 语音记录(录音,存储为WAV文件):https://blog.youkuaiyun.com/haoranhaoshi/article/details/87888382 Java 语音识别(百度语音API):https://blog.youkuaiyun.com/haoranhaoshi/article/details/87888407 Java 语音合成并播放(百度语音API):https://bl...

haoranhaoshi的博客 3583

使用百度的长文本转语音API时无法下载.MP3文件

我在百度提供的API代码(长文本转语音)的基础上添加了下载生成的.MP3文件的代码,运行之后成功建成了.MP3文件,但是文件的内容确实以下的报错信息,根据这一信息采用了新的accesstoken之后依旧无法解决。从这段代码可以看出,curl变量前面被用来做POST请求,后面又被用来做GET请求,第一次操作的状态影响了第二次,导致第二次发给服务器的数据错了。看了输出,发现获取链接的部分已经完成,是后面下载这一链接里MP3文件的代码中存在的问题,但是经过查询都没有指出这一部分代码的问题。

研究兴趣:智能物联网、嵌入式系统、人工智能 1168
上一篇: Android“再按一次退出程序”的具体实现
下一篇: Android中Fragment的两种使用方法
潘建成
博客等级 码龄12年 139粉丝 120原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值