天天看點

安卓第一課:通過一個簡單的MP3播放器來認識安卓開發【下】

        前面我們講解了如何從SD卡中擷取MP3檔案的清單,并将檔案清單放置到一個ListView裡。後來發現還少提一個内容就是權限問題,我們需要在Android Application的AndroidManifest.xml檔案中添加如下一行内容:

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

        網上找的。然後思考下這裡給的是WRITE的權限,但是我們并沒有寫啊,是以估計這個WRITE是向下相容的(畢竟寫要比讀進階一點點)。再進行搜尋,得到如下的說明:

        http://blog.csdn.net/stephen255/article/details/9142923

        上面的blog中列出了大量的權限說明,應該足夠用了!

        下面回到正題,開始播放器設定。

        首先我們設定一個全局的播放器對象:private MediaPlayer mp=null;

        通過搜尋引擎的查詢我們獲知對于MediaPlayer主要需要設定一下幾個方法來進行播放:

        1、setDataSource——設定播放器的播放源(本地檔案或者網絡位址檔案)

        2、prepare——相當于開始裝載播放源,準備播放

        【如果是利用MediaPlayer的create方法來建立的播放對象以上兩步是可以省略的,因為在create的時候已經完成了】

        3、start——開始播放(其他輔助方法有:pause、stop、seekTo等)

        其他還有些事件監聽:setOnCompletionListener、setOnSeekCompleteListener等

        有興趣的同學可以檢視API文檔:http://www.android-doc.com/reference/android/media/MediaPlayer.html

        我們這裡就簡單的使用下setDataSource、prepare和start先。

        那麼我們該什麼時候去NEW一個MediaPlayer的執行個體,當然是選擇清單中的某一項的時候。那麼當我們選擇清單中的某一項時會激發什麼事件呢?這就需要看看ListView有哪些事件監聽,通過查詢API,我們找到了setOnItemClickListener事件監聽(不過這個不是屬于ListView類的,而是繼承自AdapterView類。

        是以我們修改前一篇中的代碼:

lvMP3List.setAdapter(ladapter); 
    lvMP3List.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
            // TODO Auto-generated method stub
        }
    });
           

        這裡我們就對lvMP3List這個ListView設定了ItemClick的事件監聽,并重寫了onItemClick方法。該方法有四個參數分别表示了擴充卡、擴充卡裡的項、位置、行号。這時我們需要取得我們所點的那行中的MP3個歌曲的位址,是以我們在onItemClick方法裡添加代碼如下:

// TODO Auto-generated method stub
TextView tv=(TextView)arg1.findViewById(R.id.ItemText);
String currentMP3=(String) tv.getText();
           

        通過表示擴充卡裡的項的那個參數arg1來找到ID為ItemText的文本框。還記得前面設定擴充卡的時候的relative.xml檔案中有兩個TextView,一個叫ItemText,一個叫ItemTitle,前者表示完整路徑,後者表示檔案名。我們這裡需要完整路徑,是以就擷取ItemText的值。

        然後我們就可以播放了:

// TODO Auto-generated method stub
TextView tv=(TextView)arg1.findViewById(R.id.ItemText);
String currentMP3=(String) tv.getText();
mp=new MediaPlayer();
mp.setDataSource(currentMP3);
mp.prepare();
mp.start();
           

        但是寫了上面的代碼後系統會提示你setDataSource和prepare兩個方法可能會有異常,是以推薦使用try/catch來捕獲,使用系統推薦的處理方法:surround with try/catch。完整代碼如下:       

// TODO Auto-generated method stub
TextView tv=(TextView)arg1.findViewById(R.id.ItemText);
String currentMP3=(String) tv.getText();
mp=new MediaPlayer();
try {
    mp.setDataSource(currentMP3);
} catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
try {
    mp.prepare();
} catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
mp.start();
           

        好了。現在我們可以run as android application了。

        不過運作了之後我們發現點了某行之後的确能播放該MP3音樂,但是也出現了一個問題,點了一行,播放了,然後再點另外一行,又播放了,然後兩個音樂就混在一起了。

        OK,思考題出來了。

        思考題一:同一時間隻能播放一首音樂

        思考題二:在界面上添加播放進度條,并且能夠拖動播放

        思考題三:當我們點了傳回按鈕或者主界面按鈕後,音樂播放并沒有停止,這個該如何實作。

        以上思考題第一題是必須要實作的,思考題二可以嘗試,思考題三請先看後面一篇“android生命周期”文章後再實作,或者自己百度android生命周期。進而也能比較容易的實作。