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);
		}
	}
}

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

猜你喜欢

转载自blog.csdn.net/qq_32587949/article/details/78656341