最近在做一个音乐播放器的小玩意, 在实现了本地音乐的歌曲播放后,希望能够播放网络上的歌曲,于是有了下面的一波乱操作 @@
数据都是易源数据提供的API,网址是这个https://www.showapi.com/,有兴趣的可以去看一看。。
1、歌曲实体类
歌曲的重要组成部分是:歌名、演唱者、专辑图片、歌词、歌曲地址
所以创建一个实体类,其中通过songid可以获取歌词,m4a地址可以获取歌曲链接,albumpic_big是图片链接,singername和songname就是演唱者和歌名了,接下来就是要去获取资源了。
2、获取资源
易源数据API中的接口链接是这个,用于通过关键字查询相关歌曲,其中showapi_appid和showapi_sign是需要注册账号的,这些都很简单。然后keyword是搜索关键字的参数,page是第几页。现在我以搜索许嵩为例演示一下:
为了方便我直接用浏览器进行一个获取,Android代码获取数据也给大家贴贴一下:
private String getDataBySingerOrSong(int page,String keyword) throws IOException {
Request request = new Request.Builder()
.url("http://route.showapi.com/213-1?showapi_appid="+
NetWorkUtils.APPID+"&showapi_sign="+
NetWorkUtils.SECRET+"&keyword="+keyword+"&page="+page+"&")
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
放入在线json解析中区去看一下效果
返回的是一大串json数据,通过JsonObject对象就可以进行一个解析了。
String json = (String) msg.obj;
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray jsonArray = jsonObject.getJSONObject("showapi_res_body").getJSONObject("pagebean").getJSONArray("contentlist");
netWorkMusics = new ArrayList<NetWorkMusic>();
for(int i = 0; i < jsonArray.length();i++){
JSONObject jo = jsonArray.getJSONObject(i);
String singername = jo.getString("singername"); //显示歌曲,
String songname = jo.getString("songname"); //显示歌名,
String m4a = jo.getString("m4a"); //用来播放歌曲
String albumpic_big = null;
if(jo.isNull("albumpic_big")){
albumpic_big = null;
}else{
albumpic_big = jo.getString("albumpic_big"); //用来设置背景和圆盘
}
String songid = jo.getString("songid"); //用来查找歌词
}
//
} catch (JSONException e) {
e.printStackTrace();
}
获取到数据后就可以封装到实体对象NetWorkMusic里面了,然后就可以显示到界面里面。
数据获取到了,也显示出来了,这就成功一大半了!!
接下来就是通过albumpic_big来获取图片。。要在子线程中完成的
我就直接贴代码吧:
public void getBitmap(){
//先将背景图片给加载一下
new Thread(){
public void run() {
try {
if(NetWorkUtils.netWorkMusic.getAlbumpic_big() != null)
{
URL url = new URL(NetWorkUtils.netWorkMusic.getAlbumpic_big());
NetWorkUtils.bitmap = BitmapFactory.decodeStream(url.openStream());
}else{
NetWorkUtils.bitmap = null;
}
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
还有通过MediaPlayer来播放音乐文件:
//设置监听:播放出错、播放完成、准备完成
mediaPlayer.setDataSource(NetWorkUtils.netWorkMusic.getM4a());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
System.out.println("开始播放网络歌曲");
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
next();
}
});
还差就是歌词了,这个要通过songid去获取,怎么获取呢?易源数据API提供了一个songid查找歌词的接口,很方便的!!!!
将你上面获取的musicid传入进去就可以了,假设我们以许嵩的《素颜》为例子
是不是歌词都有了,接下来又是通过 JsonObject来获取了,但是有没有发现歌词和我们见到的歌词有点不一样!!!
所以需要一个手动的字符串replace一下啦。
把一些基本的替换一下,歌词就差不多可以 进行一个解析了,解析操作就是基本的字符串操作,我就不列代码了,大家加油一般都是可以 写出来的!!
现在歌名、演唱者、专辑图片、音频文件、歌词都有了,然后你懂得,放到界面里面就可以工作了@@
3、效果图片
源码就不给大家了, 给大家运行一遍跟自己写一遍的效果肯定不一样的,大家一起加油吧!!!