Android音乐播放器-热门榜单
这次实现得是获取XX音乐热门榜单,使用的还是易源接口API,网址是https://www.showapi.com/,感兴趣的去看一看啦~
先给大家看一下我实现得效果吧@@
咳咳,是不是很好看@@,先整理一下思路吧。易源数据提供的API接口,直接访问就可以获取相关的数据了,然后将数据显示到自己的界面上,这样就大功告成了!!!好像不难对吧。
1、获取数据
这个是获取数据的url了,你可以放到浏览器里面去访问以下,其中showapi_appid是应用id,showapi_sign是**,这两个参数都要你去易源数据注册的,免费的。然后还有一个topid参数,这个参数易源数据也有介绍:
这么说可以获得11种榜单,哈哈哈美滋滋,为了方便呢,我先去浏览器里面试一下!!!我用topid=3去获取欧美的榜单:
返回的是一大串json数据,你可以把这些数据放到在线json解析的网页里面去,然后就可以一目了然了。
这!!!有100条数据,要是能控制获取多少条就好了,没办法!!他提供的API就是这样。一次100条歌曲信息。。。我只要前三条就行,刚好欧美榜的第一名、第二名和第三名,其他榜单的也是一样的。
这里简要谈一下android怎么通过网络获取信息,HttpGet发送GET请求,然后通过HttpResponse获取网络流,将返回的数据读到一个bufferReader里面。。是不是很复杂!!然后我就没用这个,有一个OkHttp框架,发送GET请求和POST请求都特别的方便。我贴一下官网的GET请求代码吧:
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
再贴一下我获取数据的代码吧:
private OkHttpClient client = new OkHttpClient();
private String getTopSongByGet(int id) throws IOException {
Request request = new Request.Builder()
.url("http://route.showapi.com/213-4?showapi_appid="+
NetWorkUtils.APPID+"&showapi_sign="+
NetWorkUtils.SECRET+"&topid="+id+"&")
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
就几行代码就搞定,然后会返回一个字符串,想用的可以去百度学习一下。
言归正传!!我们现在可以获取到json数据,那么就通过JSONObject对象对json数据进行一个解析就好了,拿到歌曲信息的数组。代码如下:
JSONObject jsonObject = new JSONObject((String)msg.obj);
JSONArray ja = jsonObject.getJSONObject("showapi_res_body").getJSONObject("pagebean").getJSONArray("songlist");
final ArrayList<NetWorkMusic> list = new ArrayList<NetWorkMusic>();
for(int i = 0; i < 3;i++){//先只获取前三显示到UI界面
JSONObject jo = ja.getJSONObject(i);
String singername = jo.getString("singername"); //显示歌曲,
String songname = jo.getString("songname"); //显示歌名,
String m4a = jo.getString("url"); //用来播放歌曲
String albumpic_big = null;
if(jo.isNull("albumpic_big")){
albumpic_big = null;
}else{
albumpic_big = jo.getString("albumpic_big"); //用来设置背景和圆盘
}
String songid = jo.getString("songid"); //用来查找歌词
NetWorkMusic netWorkMusic = new NetWorkMusic(songid,m4a,albumpic_big,songname,singername);
list.add(netWorkMusic);
}
我这里只取前三条数据,要那么多也没用,嘎嘎。。2、界面布局
界面布局这个就是慢慢调啦,线性布局加上相对布局,如果数据太长显示不了就加一个ScrollView就行。主要的控件就是专辑图片,和前三名的歌名和演唱者,图片选的是第一名的专辑音乐图片,这里涉及到NetWorkMusic实体类,看不懂看我上一篇博客吧!!!
简要看一下我的布局吧,这个东西自己设计就好了:
3、显示数据
显示数据这个有点小技巧,因为我在布局里面有11个LinearLayout,所以很多个id(专辑图片id,三个textview,再乘以11,这样就有44个id了,一个个去findviewbyid吗??),我们可以打开gen文件夹下的R.java文件,这个文件里面有你的所有id,drawable,color,dimen等等这些数据的信息。
然后我就发现了一个规律,后一个在前一个的基础上+4,这么就可以用一个简单的循环就搞定了,哈哈哈,直接贴我的代码吧,还有三个textview的规律也是一样的,这样就差不多搞定了。
//根据R文件里面id的规律进行一个初始化
for(int i = 0; i < 11; i ++){
bgTop[i] = (ImageView) views.findViewById(R.id.bg_top1 + 4 * i);
topTv1[i] = (TextView) views.findViewById(R.id.top1_tv1 + 4 * i);
topTv2[i] = (TextView) views.findViewById(R.id.top1_tv2 + 4 * i);
topTv3[i] = (TextView) views.findViewById(R.id.top1_tv3 + 4 * i);
}
后面就是将数据添加到相应的控件上去,这个我就简要介绍一下:
首先发送网络请求的方法肯定要在子线程中执行,然后通过handler处理将数据更新到界面上去。差不多就是这样。然后有11种排行榜需要获取,循环发送11次吗?我一开始是这样干的!然后效果是只获取到一条的数据!!!子线程没有结束的时候再去获取下一个排行榜的数据,然后就冲突了!!不深究里面的原理了,我直接贴代码吧!!
public class OnlineMusicFragment extends Fragment {
private ImageView[] bgTop = new ImageView[11];
private TextView[] topTv1 = new TextView[11];
private TextView[] topTv2 = new TextView[11];
private TextView[] topTv3 = new TextView[11];
private ImageView currentBgTop;
private TextView currentTopTv1;
private TextView currentTopTv2;
private TextView currentTopTv3;
private int currentId;
private int index = 0;
private int[] ids = {3,4,5,6,16,17,26,27,28,32,36};
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
System.out.println("初始化网络音乐界面");
View views = inflater.inflate(R.layout.tab02, container,false);
initView(views);
currentId = ids[index];
currentBgTop = bgTop[index];
currentTopTv1 = topTv1[index];
currentTopTv2 = topTv2[index];
currentTopTv3 = topTv3[index];
getDataFromNetWork();
return views;
}
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
try {
JSONObject jsonObject = new JSONObject((String)msg.obj);
JSONArray ja = jsonObject.getJSONObject("showapi_res_body").getJSONObject("pagebean").getJSONArray("songlist");
final ArrayList<NetWorkMusic> list = new ArrayList<NetWorkMusic>();
for(int i = 0; i < 3;i++){//先只获取前三显示到UI界面
JSONObject jo = ja.getJSONObject(i);
String singername = jo.getString("singername"); //显示歌曲,
String songname = jo.getString("songname"); //显示歌名,
String m4a = jo.getString("url"); //用来播放歌曲
String albumpic_big = null;
if(jo.isNull("albumpic_big")){
albumpic_big = null;
}else{
albumpic_big = jo.getString("albumpic_big"); //用来设置背景和圆盘
}
String songid = jo.getString("songid"); //用来查找歌词
NetWorkMusic netWorkMusic = new NetWorkMusic(songid,m4a,albumpic_big,songname,singername);
list.add(netWorkMusic);
}
//更新图片
new Thread(){
public void run() {
try {
if(list.get(0).getAlbumpic_big() != null)
{
URL url = new URL(list.get(0).getAlbumpic_big());
Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());
currentBgTop.setImageBitmap(bitmap);
}
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
currentTopTv1.setText("1 "+list.get(0).getSongname()+"---"+list.get(0).getSingername());
currentTopTv2.setText("2 "+list.get(1).getSongname()+"---"+list.get(1).getSingername());
currentTopTv3.setText("3 "+list.get(2).getSongname()+"---"+list.get(2).getSingername());
//继续更新图片
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
index++;
if(index < 11){
currentId = ids[index];
currentBgTop = bgTop[index];
currentTopTv1 = topTv1[index];
currentTopTv2 = topTv2[index];
currentTopTv3 = topTv3[index];
getDataFromNetWork();
}
} catch (JSONException e) {
e.printStackTrace();
}
break;
default:
break;
}
};
};
private void getDataFromNetWork() {
new Thread(){
public void run() {
try {
System.out.println("当前ID:"+currentId);
String result = getTopSongByGet(currentId);
Message msg = new Message();
msg.what = 1;
msg.obj = result;
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}
private OkHttpClient client = new OkHttpClient();
private String getTopSongByGet(int id) throws IOException {
Request request = new Request.Builder()
.url("http://route.showapi.com/213-4?showapi_appid="+
NetWorkUtils.APPID+"&showapi_sign="+
NetWorkUtils.SECRET+"&topid="+id+"&")
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
private void initView(View views) {
//根据R文件里面id的规律进行一个初始化
for(int i = 0; i < 11; i ++){
bgTop[i] = (ImageView) views.findViewById(R.id.bg_top1 + 4 * i);
topTv1[i] = (TextView) views.findViewById(R.id.top1_tv1 + 4 * i);
topTv2[i] = (TextView) views.findViewById(R.id.top1_tv2 + 4 * i);
topTv3[i] = (TextView) views.findViewById(R.id.top1_tv3 + 4 * i);
}
}
}
应该不是很难,重点还是获取数据那一段,这些显示一下信息,老老实实敲代码就好了。。。项目源码暂时不会给大家。。
上一篇: SpringBoot入门(三)Controller的使用
下一篇: Android本地音乐播放器