多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 1.背景         在开发之鱼APP的时候,本来音乐播放器是之鱼中的一个模块,用来播放音乐使用,但是随着项目代码的编写,越来越复杂,决定将其单独的拉出来,制作为单独的APP - 音心播放器 。         写一个 音乐播放器 可以很好的锻炼自己在Android 高级上的学习 比如 :BroadCastReceiver , Service , Notification ,Activity 等之间的信息传递与控制。 ## 2.数据来源    因为音乐的资源API不好找,大多数都不提供音乐播放接口,所以选择了[易源AP](https://www.showapi.com/api/apiList)I(showAPi .com) 中的 QQ音乐接口,用着还行,而且还是免费的,只需要注册,订阅就可以使用了,返回的均是JSON数据。其他的音乐数据API的话,找了很久,应该就只有豆瓣FM 提供的 API了 ,没有使用过,这里就不做过多的评价。                 ![](https://box.kancloud.cn/2016-04-19_57157646957b6.jpg)    提供的API 包括 :      (1)热门榜单 : 可以根据不同的分类信息, 获得不同的 榜单列表数据 ,比如 欧美 ,乡音 ,摇滚 ;不过返回的数据中是没有 专辑图片的 ,可以通过下面的接口 获取专辑图片;         **单条数据展示 :** ~~~ { "albumid": 1209391, "downUrl": "http://tsmusic24.tc.qq.com/105013301.mp3", "seconds": 233, "singerid": 20697, "singername": "原子霏", "songid": 105013301, "songname": "芈月传", "url": "http://ws.stream.qqmusic.qq.com/105013301.m4a?fromtag=46" } ~~~     (2)根据歌曲ID 查询 歌词 :这个用起来还可以,提供了歌词信息,需要自己写一个单独的解析方法,进行解析;      **歌词数据 展示 :**   ~~~ { "showapi_res_code": 0, "showapi_res_error": "", "showapi_res_body": { "lyric": "[ti:海阔天空 (Edited Version)] [ar:BEYOND] [al:Words & Music Final Live With 家驹] [by:] [offset:0] [00:00.92]海阔天空 - BEYOND [00:02.27]词:黄家驹 [00:03.32]曲:黄家驹 [00:04.30] [00:19.17]今天我 寒夜里看雪飘过 [00:25.75]怀着冷却了的心窝飘远方 [00:30.77] [00:31.60]风雨里追赶 雾里分不清影踪 [00:37.82]天空海阔你与我 可会变 [00:43.27] [00:44.14]多少次迎着冷眼与嘲笑 [00:50.55]从没有放弃过心中的理想 [00:56.02] [00:56.67]一刹那恍惚 若有所失的感觉 [01:02.65]不知不觉已变淡 心里爱 [01:08.64] [01:09.66]原谅我这一生不羁放纵爱自由 [01:15.56] [01:16.40]也会怕有一天会跌倒 [01:22.72]背弃了理想谁人都可以 [01:27.84] [01:28.51]哪会怕有一天只你共我 [01:33.89] [01:43.41]今天我 寒夜里看雪飘过 [01:49.76]怀着冷却了的心窝飘远方 [01:54.86] [01:55.60]风雨里追赶 雾里分不清影踪 [02:01.92]天空海阔你与我 可会变 [02:06.61] [02:08.70]原谅我这一生不羁放纵爱自由 [02:14.86] [02:15.55]也会怕有一天会跌倒 [02:21.30] [02:21.83]背弃了理想谁人都可以 [02:27.17] [02:28.08]哪会怕有一天只你共我 [02:33.08] [02:38.06]仍然自由自我 [02:40.57] [02:41.42]永远高唱我歌 [02:44.42]走遍千里 原谅我这一生不羁放纵爱自由 [02:55.20] [02:56.14]也会怕有一天会跌倒 [03:02.26]背弃了理想 谁人都可以 [03:07.48] [03:08.67]哪会怕有一天只你共我 [03:13.58] [03:14.51]原谅我这一生不羁放纵爱自由 [03:21.27]也会怕有一天会跌倒 [03:26.00] [03:27.38]背弃了理想谁人都可以 [03:31.94] [03:33.61]哪会怕有一天只你共我", "lyric_txt": " 海阔天空 BEYOND 词:黄家驹 曲:黄家驹 今天我 寒夜里看雪飘过 怀着冷却了的心窝飘远方 风雨里追赶 雾里分不清影踪 天空海阔你与我 可会变 多少次迎着冷眼与嘲笑 从没有放弃过心中的理想 一刹那恍惚 若有所失的感觉 不知不觉已变淡 心里爱 原谅我这一生不羁放纵爱自由 也会怕有一天会跌倒 背弃了理想谁人都可以 哪会怕有一天只你共我 今天我 寒夜里看雪飘过 怀着冷却了的心窝飘远方 风雨里追赶 雾里分不清影踪 天空海阔你与我 可会变 原谅我这一生不羁放纵爱自由 也会怕有一天会跌倒 背弃了理想谁人都可以 哪会怕有一天只你共我 仍然自由自我 永远高唱我歌 走遍千里 原谅我这一生不羁放纵爱自由 也会怕有一天会跌倒 背弃了理想 谁人都可以 哪会怕有一天只你共我 原谅我这一生不羁放纵爱自由 也会怕有一天会跌倒 背弃了理想谁人都可以 哪会怕有一天只你共我", "ret_code": 0 } } ~~~        (3) 根据人名,歌名查询歌曲 :这个可以做搜索歌曲,也提供图片信息,在热门榜单接口中,不提供图片信息的,所以可以使用这个接口,拿到歌曲的图片信息包括歌手图片信息;        **单条数据信息展示 :** ****** ~~~ { "albumid": 62660, "albummid": "00449cf44ccf8n", "albumname": "Words & Music Final Live With 家驹", "albumpic_big": "http://i.gtimg.cn/music/photo/mid_album_300/8/n/00449cf44ccf8n.jpg", "albumpic_small": "http://i.gtimg.cn/music/photo/mid_album_90/8/n/00449cf44ccf8n.jpg", "downUrl": "http://tsmusic24.tc.qq.com/4833285.mp3", "m4a": "http://ws.stream.qqmusic.qq.com/4833285.m4a?fromtag=46", "media_mid": "001fhSpB0P7buZ", "singerid": 2, "singername": "BEYOND", "songid": 4833285, "songname": "海阔天空 (Edited Version)" ~~~ *** *** *** ***                 ![](https://box.kancloud.cn/2016-04-19_5715764b33606.jpg) 3.易源API SDK的使用            必须使用易源SDK ,才可以进行数据请求,这样可以省很多事,SDK中封装了,请求所必须的系统级参数,所以使用官方提供的SDK,很简单就可以实现调用,方便开发,如果你能力可以,自己可以写一个类,来提供系统级参数。     官方提供了多个开发语言的版本SDK, 下载对应版本即可,我们使用的是Android ,所以下载Android 的(非Java)版本。                   ![](https://box.kancloud.cn/2016-04-19_5715764b43914.jpg)     最后,还提供了请求源码,自己可以进行简单封装(不封装也可以)使用。    Android 的 请求源码 :       参数 : (1) appid 需要申请;                 (2) secret 创建后就生成了;                 (3) typeid  分类 信息 ~~~ //以下代码仅为演示用,具体传入参数请参看接口描述详情页. //需要引用android-async-http库(sdk中已经包括此jar包) ,其项目地址为: http://loopj.com/android-async-http/ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView txt = (TextView) this.findViewById(R.id.textView1); Button myBtn = (Button) this.findViewById(R.id.button1); final AsyncHttpResponseHandler resHandler=new AsyncHttpResponseHandler(){ public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable e) { //做一些异常处理 e.printStackTrace(); } public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { try { System.out.println("response is :"+new String(responseBody,"utf-8")); txt.setText(new String(responseBody,"utf-8")+new Date()); //在此对返回内容做处理 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }}; myBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { new ShowApiRequest( "http://route.showapi.com/213-4", "appid", "secret") .setResponseHandler(resHandler) .addTextPara("topid", "") .post(); } }); } ~~~ 4.总结    一个音乐播放器,不仅可以练习四大组件,而且还练习整个app的结构,包括网络请求等。其中最重要的是Service ,广播 ,通知 之间的通信将在后面详细列出。功能很简单 ,实现音乐列表,播放控制(上一曲,下一曲,播放,暂停),歌词滚动显示,进度条显示,倒计时实现。