[Android]第三次作業
阿新 • • 發佈:2018-12-05
Android線上音樂播放器
主要功能介紹
自動獲取雲端歌曲列表
自動載入雲端音樂並播放
播放列表迴圈播放音樂
程式執行截圖
關鍵程式碼解析
獲取雲端音樂列表
這裡使用騰訊雲物件儲存服務作為雲端資料儲存
Android端使用OkHttp3庫進行HTTPS的GET請求
因為前期測試時,ListView初始化時無法正確讀取AllMusic的資料
懷疑是回撥函式的閉包所造成的,所以在這裡使用廣播的形式,將讀取到的雲端音樂列表廣播出去後在處理加入AllMusic佇列
但是在廣播過程中也同時修改了初始化ListView的時間,所以造成無法正常初始話的原因有待商榷,可能是閉包造成的,也有可能是初始化過早造成的
- HTTPS的GET請求如下
String url = "https://code-1251175805.cos.ap-chengdu.myqcloud.com/List.txt"; final OkHttpClient okHttpClient=new OkHttpClient(); final Request request=new Request.Builder().url(url).build(); new Thread(new Runnable() { @Overridepublic void run() { try { Response response=okHttpClient.newCall(request).execute(); if (response.isSuccessful()){ String body=response.body().string(); Intent intent = new Intent("com.example.leeli.musicplayer"); intent.putExtra(Intent.EXTRA_TEXT,body); MusicListBroad.sendBroadcast(intent); }else { Log.e("E", "run: "+response.code()+response.message()); } } catch (IOException e) { e.printStackTrace(); } } }).start();
- 資料處理如下:
IntentFilter filter = new IntentFilter("com.example.leeli.musicplayer"); MusicListBroad = LocalBroadcastManager.getInstance(this); MusicListBroad.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String ListBody = intent.getStringExtra(Intent.EXTRA_TEXT); Log.i("list1",ListBody); String Item[] = ListBody.split("\r\n"); for(int i=0;i<Item.length;i++) { String temp[] = Item[i].split("@"); MusicInfo t = new MusicInfo(); t.Name = temp[0]; t.Url = temp[1]; t.Position = i; AllMusic.add(t); }
- 初始化ListView及表項的點選事件響應如下:
MusicList = (ListView) findViewById(R.id.MusicList); adapter = new BaseAdapter() { @Override public int getCount() { return AllMusic.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView MusicItem = new TextView(MainActivity.this); MusicItem.setText(AllMusic.get(position).Name); MusicItem.setTextSize(30); return MusicItem; } }; MusicList.setAdapter(adapter); MusicList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "開始播放:"+AllMusic.get(position).Name, Toast.LENGTH_LONG).show(); PlayMusic(position); } }); } },filter);
播放雲端音樂
try { mediaPlayer.reset(); mediaPlayer.setDataSource(AllMusic.get(position).Url); mediaPlayer.prepare(); mediaPlayer.start(); Start.setText("暫停"); NowMusic = position; isFirst = false; } catch (Exception e) { e.printStackTrace(); }
雲端的MusicList定義
G.E.M. 鄧紫棋-光年之外@https://code-1251175805.cos.ap-chengdu.myqcloud.com/1.mp3 LON-我的一個道姑朋友@https://code-1251175805.cos.ap-chengdu.myqcloud.com/2.mp3 阿里郎-蘭花指@https://code-1251175805.cos.ap-chengdu.myqcloud.com/3.mp3 岳雲鵬-如果有個直達天堂的電梯@https://code-1251175805.cos.ap-chengdu.myqcloud.com/4.mp3 張傑_張碧晨-只要平凡@https://code-1251175805.cos.ap-chengdu.myqcloud.com/5.mp3
專案地址
https://github.com/leeli73/AndroidOnlineMusicPlayerDemo.git
APP下載連結
https://github.com/leeli73/AndroidOnlineMusicPlayerDemo/releases/download/V1.0/OnlineMusicPlayer.apk