音樂播放器,航空訂票的一些項目總結(附部分源碼)

音樂播放器
音樂播放器,這個做品已經花了不少心思上面,包括實現播放,獲取歌詞,專輯等,網絡部分採用斷點下載方式獲取方法,這個播放器你們都懂的。
php


準備工具:Eclipse,ADT,SDK
實現需求:可以正常播放音樂,專輯和歌詞,網絡部分下載


本地音樂實現方法:一個本地音樂列表,另外一個播放界面
對本身之前作過的小項目/應用來個總結吧,首先是音樂播放器,這個做品已經花了不少心思上面,包括實現播放,獲取歌詞,專輯等,網絡部分採用斷點下載方式獲取方法,這個播放器你們都懂的。

準備工具:Eclipse,ADT,SDK
實現需求:本地可以正常播放音樂,顯示專輯圖片和歌詞
網絡部分下載

思路:就作兩個activity,
一個本地音樂列表,另外一個播放界面,列表裏把音樂信息傳遞給播放界面去,進度條經過廣播的形式,UI上我參照了相似網易新聞客戶端, 也就是TabHost+RadioButton底部來作,界面總歸好看點吧。咱們作的底部也本地和網絡兩種而已。本地音樂的頂部是單獨寫xml,中間是列表如要那麼整齊顯示那就要BaseAdapter嘍。分別用Cursor遊標遍歷,本地音樂Actvitiy顯示創建一個方法,關鍵代碼以下:
?
代碼片斷,雙擊複製
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
/**
* 顯示音樂列表
*/
private void ShowMp3List() {
Cursor cursor = getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, media_info, null ,
null , MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
if ( null != cursor && cursor.getCount() > 0 ) {
cursor.moveToFirst(); // 將遊標移動到初始位置
_ids = new int [cursor.getCount()]; // 返回INT的一個列
_artists = new String[cursor.getCount()]; // 返回String的一個列
_titles = new String[cursor.getCount()]; // 返回String的一個列
for ( int i = 0 ; i < cursor.getCount(); i++) {
_ids<I> = cursor.getInt( 3 );
_titles<I> = cursor.getString( 0 );
_artists<I> = cursor.getString( 2 );
cursor.moveToNext(); // 將遊標移到下一行
}
listview.setAdapter( new LocalMusicListAdapter( this , cursor)); // 用setAdapter裝載數據


咱們能夠看到使用遊標把媒體信息用getContentResolver方法查找出來,而後要做出判斷遊標獲取的列數是否大於0,不然即便沒有音樂也會扔異常。咱們定義了三個臨時數組,id,title,artist分別是id,標題,藝術家這些通通實例化參數是返回行數最後用個循環遍歷出來並用moveToNext移至下一行。而後用setAdapter把信息裝載適配器裏,這樣本地列表基本作完了。若是在UI花點功夫上那就更漂亮了,效果圖:(此圖應該看過)

main.png
昨天 17:43 上傳
下載附件 (585.23 KB)


播放音樂
playmusic.png
昨天 17:42 上傳
下載附件 (521.4 KB)

這部分代碼了。主要分爲顯示歌名,歌手,專輯,歌詞。若是要正確顯示歌名須要傳遞數據。那麼在列表裏用PutExtra這個方法來傳遞數據,播放這裏用Bundle接收數據。列表和播放界面都要用創建臨時變量。播放音樂的方法所有交給Service了。具體看代碼。而後進度條是經過發送廣播給服務。在activity界面裏要靜態反註冊掉,反之會拋出異常,順便創建一個幾個Action用IntentFilter最後一個要registerReceiver便可。歌詞部分須要用IO部分實現還有就是歌詞路徑問題,這個問題仍是靠本身解決了。專輯圖片效果圖:


網絡音樂部分:
實現方法有本身搭建Tomcat,但要本身開啓服務器,並且ip地址天天在換。雖然能夠實現但不推薦。另外一個方法就是咱們採用 點我查看斷點續傳,其實就是一些下載工具的技術,咱們藉助於斷點下載來達到下載歌曲掃描出如今本地音樂列表裏。若是第一次下載未完成或者意外狀況退出了。下次能夠根據上次斷開的地方從新下載,如要記錄第一次下載數據,那麼確定要數據庫了。



最後別忘記加SD卡權限以及Internnet

源碼: MusicOne1.zip
java




航空訂票
航空訂票正確方法是用webservice連上去獲得xml並下載而後解析,但沒有條件用webservice,只能用本地的開始解析,也就是在assets這裏創建一個xml解析。解析上本身定義根名吧。而後佈局方面咱們採用tabhost顯示單程和返程的UI。顯示查詢結果用Listview顯示出來了。界面參照代碼下載那帖吧。android


咱們首要任務就是怎麼弄過用戶輸入信息而正確顯示呢。咱們來看單程查詢,能夠看到都是文本和Spinner,那麼確定加上相應的監聽事件嘍。日期方面自行參考其餘資料。直接看查詢代碼:
  1. //查詢按鈕事件
  2. selectbtn.setOnClickListener(new OnClickListener() {

  3. @Override
  4. public void onClick(View v) {

  5. Intent intent = new Intent(CheckAirportTabActivity.this,
  6. SingleListActivity.class);
  7. leaveCity = gospinner.getSelectedItem().toString();//獲取出發城市選擇的選項並轉換成文字
  8. arriveCity = setofffspinner.getSelectedItem().toString();//同理
  9. leavedate = leaveDateEdt.getText().toString();//同理
  10. Bundle bundle = new Bundle();//Bundle存取數據,如出發城市,到達城市。出發日期等
  11. bundle.putString("leaveCity", leaveCity);
  12. bundle.putString("arriveCity", arriveCity);
  13. bundle.putString("leavedate", leavedate);
  14. intent.putExtras(bundle);//向查詢界面傳送數據
  15. startActivity(intent);
  16. finish();

  17. }
  18. });
複製代碼
用戶選完後按查詢後,這些數據確定傳遞如bundlle吧。否則按了後沒反映,用戶以爲這個系統很渣。或者乾脆不用了。而後就是查詢結果了那個UI,這裏咱們採用SAX解析,一上來就要接受數據。關鍵代碼以下:
  1. private ListView lv;
  2. String leaveCity,arriveCity,leavedate;

  3. public List<Map<String, Object>> parse(String path) {
  4. //定義一個單程的數組
  5. List<Map<String, Object>> singles = new ArrayList<Map<String, Object>>();
  6. //單程的實體
  7. List<SingleBean> singlebean = null;
  8. //Sax解析工廠
  9. SAXParserFactory factroy = SAXParserFactory.newInstance();
  10. Intent intent = getIntent();
  11. Bundle bundle = intent.getExtras();
  12. leaveCity = bundle.getString("leaveCity");//獲取出發的數據
  13. arriveCity = bundle.getString("arriveCity");//獲取目的城市數據
  14. leavedate=bundle.getString("leavedate");//單程的日期
  15. try {

  16. SAXParser parser = factroy.newSAXParser();
  17. XMLReader xmlreader = parser.getXMLReader();
  18. SingleXML handler = new SingleXML();//解析單程XML
  19. xmlreader.setContentHandler(handler);
  20. xmlreader.parse(new InputSource(this.getAssets().open(path)));//解析assets下解析xml
  21. singlebean = handler.getSingles();//獲取單程的是列
  22. //for增強循環遍歷實體類
  23. for (SingleBean sp : singlebean) {
  24. //根據用戶的查詢的關鍵字來查詢。因此要截取字符竄。
  25. <div class="quote"><blockquote>if (leaveCity.equals(sp.getLeaveCity().substring(0, 2)
  26. .toString())
  27. && arriveCity.equals(sp.getArriveCity().substring(0, 2)
  28. .toString()))
複製代碼
{
//而後Map的容器裝入進去。
Map<String, Object> map = new HashMap<String, Object>();
map.put("listview1", sp.getValue());//獲取Value
map.put("listview2", sp.getKey());//獲取關鍵字
map.put("listview3", sp.getLeaveCity());//獲取出發城市
map.put("listview4", sp.getArriveCity());//獲取到達城市
map.put("listview5", sp.getLeavetime());//獲取離開時間
map.put("listview6", sp.getEndtime());//獲取目的時間
map.put("listview7", sp.getPrice());//獲取價格
map.put("listview8", sp.getDisaccount());//獲取折扣
singles.add(map);//添加進map對象裏。
} else {
continue;
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return singles;

}SAX解析過程很少說,關鍵地方在這裏,根據用戶的查詢的關鍵字來查詢。因此咱們要截取字符竄。不然會很亂的,以後用map容器把各個根目錄裝載進去了。OK。簡單的查詢任務完成了
if (leaveCity.equals(sp.getLeaveCity().substring(0, 2) .toString()) && arriveCity.equals(sp.getArriveCity().substring(0, 2) .toString()))
相關文章
相關標籤/搜索