網頁

2009年10月1日 星期四

Android教學程式設計-音樂撥放第一彈 MediaPlayer

Android程式設計-音樂撥放第一彈 MediaPlayer
Android播放音樂很簡單,在SDK裡簡單了說明了如果要撥放音樂只需要簡單的程式即可達到撥放的功能,
可以播放mp3 wav AAC格式,播放資源檔裡的音樂只需要兩行
MediaPlayer mp = MediaPlayer.create(context, R.raw.檔名);
mp.start();

哇這麼簡單阿,那趕快來試試看,但是怎麼把音樂放到資源檔裡面呢,很簡單
只要打開程式專案的資料夾,例如我的專案放在
D:\Android\Code\Music1
打開資料夾,看到res資料夾,裡面就擺放著所有資源檔,
進入res資料夾,注意音樂或是音效統一要放在raw資料夾下面
預設是沒有這個資料夾的,所以我們建立raw資料夾,並將音樂檔案複製到這個資料夾下方
完成之後回到Eclipse,我們並沒有看到該檔案存在res下,那是因為還沒更新,
只要點選右鍵選擇Refresh,就會發現加到資源檔裡,例如我加入的是Hony.mp3
程式只要寫下
MediaPlayer mp = MediaPlayer.create(context, R.raw.Hony);
mp.start();

但是你會發現,奇怪為什麼R.raw. ? 沒有發現Hony這個檔案
這是因為R.java 不接受res檔名, 注意這裡很容易出錯
res下方的檔案名稱,只接受小寫的英文字母,和數字,不接受任何大寫的檔案
更別說中文名稱的檔案了,甚至數字開頭的檔案名稱他也不吃,這是需要注意的
將檔名改成hony.mp3後在點選 refresh 就可以看到hony.mp3 加到資源檔了.如果想要播放sd卡裡的音樂呢?
SDK寫
MediaPlayer mp = new MediaPlayer();
mp.setDataSource("路徑");
mp.prepare();
mp.start();
但實際把程式貼到Eclipse
mp.setDataSource("路徑");
mp.prepare();
會出現surround with try/catch
因為讀取了SD卡可能會有錯誤,所以要加入如果讀取錯誤該怎麼處理錯誤的
最少要寫成這樣才能執行
MediaPlayer mp = new MediaPlayer();
try {
mp.setDataSource("路徑");
mp.prepare();
} catch (IllegalArgumentException e) {
} catch (IllegalStateException e) {
} catch (IOException e) {
}
mp.start();

現在還不知道路徑是什麼,簡單介紹一下Android為linux系統,Linux與windows系統的檔案系統有觀念上得不同
就是linux 的每個一個資料夾或是檔案,都是有權限的,最大權限的那個帳號叫做root,這個帳號可以對所有檔案進行
刪除或變更,但是我們並不是這個帳號,我們只是一般使用者,所以Android 上得大部分的檔案我們都沒有權限取存他

如果程式要存取檔案之前,都必需要有足夠的權限喔,模擬器現在有三大資料夾Data,SDcare,system
data 我們可以存取,但是sdcare為什麼不行喔,這真的很奇怪(因為建立AVD的時候沒有給予sd卡空間)(sdcard 的 permissions 只有d--------- 表示,沒有建立sdcard,所以不可以上傳任何資料)
但是怎麼把檔案上傳到模擬器的SD卡裡面呢?這裡有兩個問題,第一個問題,模擬器要模擬SD卡,所以在AVD設定時就要設定了,如下圖
第二個問題怎麼上傳。
第一步 設定一個擁有64M的模擬器
這樣我們的模擬器就有64M的 SD卡了
第二步 怎麼上傳檔案到模擬器呢,我們需要DDMS的幫助
DDMS簡單說,他是幫我們控制模擬器的程式,例如你需要模擬程式進行過程當中,有一通電話撥進來
或是程式執行時,有一通簡訊進來了,或是呢現在GPS的訊號是在經緯度多少,這一方面的手機控制,都是透過 DDMS
不過DDMS不只有這些功能,他主要幫助Debug的工具,所以需要和他博一些感情。
啟動DDMS在IDE的這個地方
然後我們透過DDMS這個按鈕將檔案上傳到sdcard裡面,注意上傳之前,如下圖在sdcard上點一下,
讓他呈現反白,如果沒有點選他,上傳的圖示就沒有作用.
目前我們只能傳到sdcard 還不能建立目錄,因為ddms並沒有很完整的檔案管理介面,所以下一章節我會介紹一下如何管理
還有這個章節如果一直沒有辦法把檔案傳道sdcard 那就先傳到data下面也可以,只是撥放路徑要改就可以,
看過下一章節或許比較可以控制模擬器上的檔案
上傳完成之後
我們把程式碼的路徑 改成 \sdcard\test.mp3
啟動程式, ㄟ ,美妙的音樂傳了出來, 真是感動阿

4: import java.io.IOException;

6: import android.app.Activity;
7: import android.media.MediaPlayer;
8: import android.os.Bundle;

10: public class Music1 extends Activity {
11: /** Called when the activity is first created. */
12: @Override
13: public void onCreate(Bundle savedInstanceState) {
14: super.onCreate(savedInstanceState);
15: setContentView(R.layout.main);
16: MediaPlayer mp = new MediaPlayer();
17: try {
18: mp.setDataSource("/sdcard/test.mp3");
19: mp.prepare();
20: } catch (IllegalArgumentException e) {
21: } catch (IllegalStateException e) {
22: } catch (IOException e) {
23: }
24: mp.start();
25: }
26: }


為什麼說很感動呢?因為其實為了撥放出這一段音樂, 我花了超過四個小時的時間尋找和探索如何把檔案上傳到sdcard 還有我一直以為路徑要寫成 file:\\\sdcard\test.mp3
錯誤連連,所以新手們,程式碼一直錯誤別害怕,這個都是因為我們還不習慣這個程式語言
不習慣這個介面,只要我們多摸他,多了解他的習性, 還是可以做出來,堅持的動力是因為
有很多人都走過向我們證明一定可以辦的到,只是需要熟悉 ,美妙的聲音 多Run幾次 真爽
雖然只有幾行的程式碼.

4 則留言:

Unknown 提到...

good 加油
我也是 beginner

Detry 提到...

尝试给自己和你的家人更多的关注。与您的家人或朋友,而你花你的空闲时间,我们会为你写的,散文,文凭和其他工作需要。生活发挥到淋漓尽致。论文格式

匿名 提到...

請問這段程式碼
MediaPlayer mp = MediaPlayer.create(context, R.raw.Hony);
mp.start();

該貼在整個程式的哪裡呢~~~~
謝謝

雷哥的遊戲頻道 提到...

感謝您願意分享這些知識!幫助我良多啊QQ