百度音乐盒提供了一个便捷的API可以拿来访问一些音乐资源,开发者通过访问指定格式的url可以拿到返回的数据,这个数据可以是json或者xml,这里面包含了歌曲的信息。完整的API各种访问格式是非常丰富的,参见http://www.cnblogs.com/liuying1995/p/5704176.html。这里我们只实现查询关键字,得到返回的歌曲列表和百度定义的歌曲的id,然后再使用这个id访问,再从返回的数据中得到歌曲和歌词的地址,接下来就可以顺利完成歌曲的播放和下载了。-------另外,本文中还提供了一个动态显示歌词的自定义view和读取歌词文件的工具类。

我直接展示我的实现思路:

1.接收输入框的输入文字并传到查询方法里。

String name = etSearch.getText().toString();if (name.length() == 0) {Toast.makeText(this, "请输入歌曲名称", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this,"已开始查询,请耐心等待",Toast.LENGTH_SHORT).show();query2(name);}

2.在查询方法中访问URL并得到返回的json,传入解析json的方法。这里面的url字符串格式参见开头提到的网站,可以看到字符串最后的参数query=我们传入的查询数据。

private void query2(final String title){new Thread(new Runnable() {@Overridepublic void run() {try {HttpURLConnection connection;String finalTitle = URLEncoder.encode(title,"utf-8");URL url = new URL("http://tingapi.ting.baidu.com/v1/restserver/ting?from=webapp_music&method=baidu.ting.search.catalogSug&format=json&callback=&query="+finalTitle);connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(60*1000);connection.setReadTimeout(60*1000);connection.connect();BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String s;if ((s=reader.readLine())!=null)doJson(s);} catch (IOException e) {e.printStackTrace();}}}).start();}

3.在解析方法中最终取得歌曲的名称,艺术家,地址,歌词地址信息,json解析就不具体展开了,然后我把这些数据封装在自定义的Song对象里。(方法中调用了两个方法,分别是获取歌曲地址和歌词地址,在下面会展示,这是因为获取这两个数据需要用得到的歌曲的id再一次访问)。

//解析返回的jsonpublic Song doJson(String json){Song song = null;JSONObject jsonObject = null;list.clear();//清空原有的歌曲数组try {//去掉括号json = json.replace("(","");json = json.replace(")","");jsonObject = new JSONObject(json);JSONArray array = new JSONArray(jsonObject.getString("song"));for (int i=0;i<array.length();i++){JSONObject object = array.getJSONObject(i);String songname = object.getString("songname");String artistname = object.getString("artistname");String songid = object.getString("songid");String adress = getAdress(songid);Song song1 = new Song(songname,artistname,adress,0);song1.setLrcPath(getLrcAdress(songid));list.add(i,song1);Log.v("tag",songname+"  "+artistname+"  "+songid);//列表更新Message msg = new Message();msg.what = 1;handler.sendMessage(msg);}} catch (JSONException e) {e.printStackTrace();}return song;}public String getAdress(final String songid){new Thread(new Runnable() {@Overridepublic void run() {try {HttpURLConnection connection;//URL url = new URL("http://api.5288z.com/weixin/musicapi.php?q="+finalTitle);URL url = new URL("http://ting.baidu.com/data/music/links?songIds="+songid);connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(60*1000);connection.setReadTimeout(60*1000);connection.connect();BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String s;if ((s=reader.readLine())!=null){s = s.replace("\\","");//去掉\\try {JSONObject object = new JSONObject(s);JSONObject object1 = object.getJSONObject("data");JSONArray array = object1.getJSONArray("songList");JSONObject object2 = array.getJSONObject(0);adress = object2.getString("songLink");Log.v("tagadress",adress);} catch (JSONException e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}}).start();try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}return adress;}//获取歌词地址public String getLrcAdress(final String songid){new Thread(new Runnable() {@Overridepublic void run() {try {HttpURLConnection connection;//URL url = new URL("http://api.5288z.com/weixin/musicapi.php?q="+finalTitle);URL url = new URL("http://ting.baidu.com/data/music/links?songIds="+songid);connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(60*1000);connection.setReadTimeout(60*1000);connection.connect();BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String s;if ((s=reader.readLine())!=null){s = s.replace("\\","");//去掉\\Log.v("tag","------"+s);try {JSONObject object = new JSONObject(s);JSONObject object1 = object.getJSONObject("data");JSONArray array = object1.getJSONArray("songList");JSONObject object2 = array.getJSONObject(0);LrcAdress = object2.getString("lrcLink");Log.v("tag","888888lrc"+ LrcAdress);} catch (JSONException e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();}}}).start();try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}return LrcAdress;}

4.展示歌词的自定义view(转):这里传入了一个自定义的歌词类,是把每一行歌词作为一个对象,其中有歌词内容和歌词开始时间这两个值。

package com.example.one.newmusicplayer.ui;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;import com.example.one.newmusicplayer.item.LrcOne;import java.util.ArrayList;
import java.util.List;/*** Created by lenovo on 2016/10/27.* 显示歌词的自定义view*/
public class LrcView extends TextView {private float width;        //歌词视图宽度private float height;       //歌词视图高度private Paint currentPaint; //当前歌词画笔private Paint notCurrentPaint;  //非当前歌词画笔private float textHeight = 45;  //每一行高度private float textSize = 35;        //每一行非当前文字的大小private int index = 0;      //list集合下标private List<LrcOne> list = new ArrayList<>();public LrcView(Context context) {super(context);init();}public LrcView(Context context, AttributeSet attrs) {super(context, attrs);init();}private void init() {setFocusable(true);     //设置可对焦//高亮部分currentPaint = new Paint();currentPaint.setAntiAlias(true);    //设置抗锯齿,让文字美观饱满currentPaint.setTextAlign(Paint.Align.CENTER);//设置文本对齐方式//非高亮部分notCurrentPaint = new Paint();notCurrentPaint.setAntiAlias(true);notCurrentPaint.setTextAlign(Paint.Align.CENTER);}/*** 绘画歌词*/@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if(canvas == null) {return;}//设置字体的大小颜色样式以及绘制出来的画笔currentPaint.setColor(Color.argb(210, 251, 0, 0));notCurrentPaint.setColor(Color.argb(140, 0, 0, 0));currentPaint.setTextSize(40);currentPaint.setTypeface(Typeface.SERIF);notCurrentPaint.setTextSize(textSize);notCurrentPaint.setTypeface(Typeface.DEFAULT);try {setText("");canvas.drawText(list.get(index).getLrcStr(), width / 2, height / 2, currentPaint);float tempY = height / 2;//画出本句之前的句子for(int i = index - 1; i >= 0; i--) {//向上推移tempY = tempY - textHeight;canvas.drawText(list.get(i).getLrcStr(), width / 2, tempY, notCurrentPaint);}tempY = height / 2;//画出本句之后的句子for(int i = index + 1; i < list.size(); i++) {//往下推移tempY = tempY + textHeight;canvas.drawText(list.get(i).getLrcStr(), width / 2, tempY, notCurrentPaint);}} catch (Exception e) {setText("");}}/*** 当view大小改变的时候调用的方法*/@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);this.width = w;this.height = h;}public void setIndex(int index) {this.index = index;}public void setmLrcList(List<LrcOne> mLrcList) {this.list = mLrcList;}
}

5.读取歌词文件的工具类,读取后封装在一个歌词类的数组里。

package com.example.one.newmusicplayer.tools;import android.util.Log;
import android.widget.Toast;import com.example.one.newmusicplayer.item.LrcOne;import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
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.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;/*** Created by lenovo on 2016/10/27.* 读取歌词并将其拆成一个个歌词类的工具类*/
public class LrcDeal {public List<LrcOne> getList() {return list;}private List<LrcOne> list = new ArrayList<>();//读取歌词并返回一个装满歌词对象的list//读取网络歌词文件的方法public List<LrcOne> readIntnetLrc(String path){InputStream inputStream = null;try {URL url = new URL(path);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(60*1000);connection.setReadTimeout(60*1000);inputStream = connection.getInputStream();} catch (Exception e) {e.printStackTrace();}StringBuilder stringBuilder = new StringBuilder();//创建一个文件输入流try {//创建一个文件输入流对象BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));String s = "";while((s = br.readLine()) != null) {s = s.replace("[", "");s = s.replace("]", "@");//分离“@”字符String splitLrcData[] = s.split("@");LrcOne lrcOne = new LrcOne();if(splitLrcData.length > 1) {lrcOne.setLrcStr(splitLrcData[1]);//处理歌词取得歌曲的时间int lrcTime = time2Str(splitLrcData[0]);lrcOne.setLrcTime(lrcTime);//添加进列表数组list.add(lrcOne);}}} catch (FileNotFoundException e) {e.printStackTrace();stringBuilder.append("木有歌词文件,赶紧去下载!...");} catch (IOException e) {e.printStackTrace();stringBuilder.append("木有读取到歌词哦!");}return list;}//对时间字符串进行处理public int time2Str(String timeStr) {timeStr = timeStr.replace(":", ".");timeStr = timeStr.replace(".", "@");String timeData[] = timeStr.split("@"); //将时间分隔成字符串数组//分离出分、秒并转换为整型int minute = Integer.parseInt(timeData[0]);int second = Integer.parseInt(timeData[1]);int millisecond = Integer.parseInt(timeData[2]);//计算上一行与下一行的时间转换为毫秒数int currentTime = (minute * 60 + second) * 1000 + millisecond * 10;return currentTime;}
}

使用百度音乐盒API接口实现音乐播放器相关推荐

  1. JavaScript + Audio API自制简易音乐播放器(详细完整版、小白都能看懂)

    JavaScript + Audio API自制简易音乐播放器(详细完整版) ** 音乐播放器的功能清单如下: ** 1.点击暂停按钮,歌曲暂停 2.点击播放按钮,歌曲播放 3.单曲循环与取消单曲循环 ...

  2. [更新]基于MFC对话框并使用MCI接口的音乐播放器

    使用MCI接口编写能播放MP3,WAV格式的音频文件 程序信息: 程序名称:My Music Player 作者 :CodeMore 编译时间:2016年1月31日 星期日 版本: 1.0 程序原理: ...

  3. 基于51单片机音乐盒仿真设计(音乐播放器)

    基于51单片机音乐盒仿真设计( proteus仿真+程序+原理图+PCB+报告+讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0 ...

  4. ESP32 也能实现精美UI 使用 HaaS UI Lite (Python)打造音乐播放器

       音乐播放器是大家日常使用最多的工具之一,类似的音频播放场景还有在医院/银行经常见到的排队叫号系统.工业场景中常用的的操作提示装置等等. 1.简介    本文将基于HaaS UI Lite开发框架 ...

  5. QT 基于 百度云语音识别, 基于网易API 接口的歌曲查询,的音乐播放器。

    1.成果展示: 2.界面操作提示 1.  2种方法把歌曲加入列表, 第一种加入本地资源,第二种 加入网上搜索的歌曲 2.  加入本地资源,点击图片  +  ,然后再本地资源里面添加歌曲 3.  网上搜 ...

  6. iOS一个模仿百度音乐盒的音乐播放器(带EQ均衡器)

    工作之余, 断断续续写了这么一个音乐播放器, eq实现各种音效, 指定位置播放, 快进快退, 锁屏耳机线控等等, 基本就是参考百度音乐盒的功能来实现的.(项目地址最后放出, 项目中的资源接口, 是抓百 ...

  7. 在线音乐播放器-----酷狗音乐api接口抓取

    首先身为一个在线音乐播放器,需要前端和数据库的搭配使用. 在数据库方面,我们没有办法制作,首先是版权问题,再加上数据量.所以我们需要借用其他网络播放器的数据库. 但是这些在线播放器,如百度,酷狗,酷我 ...

  8. 基于Qt的网络音乐播放器(四)酷狗API接口获取歌曲的搜索列表和歌曲的播放

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.效果图 2.准备好前面获取的酷狗api接口 3.网络歌曲搜索实现 4.网络歌曲播放的实现 ...

  9. vue 判断同一数组内的值是否一直_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目

    项目名称:vue-fds_music 项目作者:符道胜 开源许可协议:Apache-2.0 项目地址:https://gitee.com/fudaosheng/vue-fds_music 项目简介 V ...

最新文章

  1. RESTful API 设计最佳实践
  2. 图解深度强化学习(简单的)
  3. java以太网通讯西门子plc300_西门子300以太网通讯-工业支持中心-西门子中国
  4. 2012-5-3 线程和进程的区别
  5. 关于运维自动化工具saltstack的教程更新页面
  6. Boost:BOOST_VERIFY的用法测试程序
  7. Laravel5.1 搭建博客 --编译前端文件
  8. 使用Docker分分钟启动常用应用
  9. 机械系统计算机控制试卷及答案,机械系统设计试题及答案
  10. 据说有人面试栽在了Thread类的stop()方法和interrupt()方法上
  11. ora-04098 触发器无效且未通过重新验证
  12. Atitit 循环处理的新特性 for...else...
  13. android 2个 微信,手机挂2个微信可以吗?安卓手机挂2个微信以上教程
  14. 在《寒门状元之死》上,咪蒙贩卖的是什么?
  15. TweenMax(一)基础语法
  16. 【漫画+图解】面试官让我用 2GB 内存给 20亿个整数(需要8GB内存)排序,我该咋整??
  17. 微信小程序---修改背景颜色和单个页面的背景颜色
  18. 模电—初探MOSFET
  19. 银河系的神秘信号:也许我们正见证真实的科幻故事
  20. 洛谷P2905 [USACO08OPEN]农场危机Crisis on the Farm

热门文章

  1. 将Rosbag中compressed图像转换成raw类型
  2. 汽车电子行业的 C 语言编程标准
  3. 阿里云查看mysql数据库密码是多少_阿里云服务器查看数据库密码是多少
  4. python画地球仪_用 pyecharts 制作地球仪
  5. MRPII和TPS生产方式的比较
  6. 关于jsonp跨域的问题以及解决方法(跨域、同源与非同源)
  7. GoldenGate 日常监控
  8. 海信威武!吞并日本东芝,又一家日本巨头倒下
  9. 计算机阿亮音乐,I_阿亮_单曲在线试听_酷我音乐
  10. linux 单曲循环函数,怀旧音乐播放器 Exaile(也有单曲循环)