欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android音乐播放器-热门榜单

程序员文章站 2022-05-29 22:19:28
...

这次实现得是获取XX音乐热门榜单,使用的还是易源接口API,网址是https://www.showapi.com/,感兴趣的去看一看啦~

先给大家看一下我实现得效果吧@@

Android音乐播放器-热门榜单

Android音乐播放器-热门榜单

咳咳,是不是很好看@@,先整理一下思路吧。易源数据提供的API接口,直接访问就可以获取相关的数据了,然后将数据显示到自己的界面上,这样就大功告成了!!!好像不难对吧。

1、获取数据

Android音乐播放器-热门榜单

这个是获取数据的url了,你可以放到浏览器里面去访问以下,其中showapi_appid是应用id,showapi_sign是**,这两个参数都要你去易源数据注册的,免费的。然后还有一个topid参数,这个参数易源数据也有介绍:

Android音乐播放器-热门榜单

这么说可以获得11种榜单,哈哈哈美滋滋,为了方便呢,我先去浏览器里面试一下!!!我用topid=3去获取欧美的榜单:

Android音乐播放器-热门榜单

返回的是一大串json数据,你可以把这些数据放到在线json解析的网页里面去,然后就可以一目了然了。

Android音乐播放器-热门榜单

这!!!有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实体类,看不懂看我上一篇博客吧!!!

简要看一下我的布局吧,这个东西自己设计就好了:

Android音乐播放器-热门榜单

3、显示数据

显示数据这个有点小技巧,因为我在布局里面有11个LinearLayout,所以很多个id(专辑图片id,三个textview,再乘以11,这样就有44个id了,一个个去findviewbyid吗??),我们可以打开gen文件夹下的R.java文件,这个文件里面有你的所有id,drawable,color,dimen等等这些数据的信息。

Android音乐播放器-热门榜单

然后我就发现了一个规律,后一个在前一个的基础上+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);
		}
	}
}

应该不是很难,重点还是获取数据那一段,这些显示一下信息,老老实实敲代码就好了。。。项目源码暂时不会给大家。。