android開發之背景音樂與音效
一:添加背景音樂(MediaPlayer)
MediaPlayer class can be used to control playback of audio/video files and streams.MediaPlayer 類是用來控制音頻和視頻文件的播放;
實例化MediaPlayer的方法:
-
-
直接new的方式:MediaPlayer mp = new MediaPlayer();
-
使用create的方式,如:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//這時就不用調用setDataSource了
-
使用直接new的方式創建對象時,設置要播放的文件的方法:MediaPlayer要播放的文件主要包括3個來源:
-
- 用戶在應用中事先自帶的resource資源 例如:MediaPlayer.create(this, R.raw.test);
- 存儲在SD卡或其他文件路徑下的媒體文件 例如:myMediaplayer.setDataSource("/sdcard/test.mp3");
- 網絡上的媒體文件 例如:myMediaplayer.setDataSource(http://music.baidu.com/song/490468);
開始播放,停止播放,暫停播放的方法:注意在停止以及暫停播放后要選擇一個合適的時間去重新開始也就是調用seekto()方法;

實現監聽播放完畢時的方法(這里使用了匿名內部類的方法),可以在播放完畢之后接着播放,也可以停止:
必須釋放音頻,否則會報錯:

二:音效(SoundPool)
SoundPool
The SoundPool class manages and plays audio resources for applications. SoundPool類是Android用於管理和播放應用程序的音頻資源的類。一個SoundPool對象可以看作是一個可以從APK中導入資源或者從文件系統中載入文件的樣本集合。它利用MediaPlayer服務為音頻解碼為一個原始16位PCM流。這個特性使得應用程序可以進行流壓縮,而無須忍受在播放音頻時解壓所帶來的CPU負載和時延。
SoundPool在載入聲音文件過程中,使用了單獨的線程,不會對視覺和UI性能產生影響。但SoundPool對載入聲音文件大小有所限制
SoundPool與MediaPlayer相比,MediaPlayer存在着資源占用量較高、延遲時間較長、不支持多個音頻同時播放等缺點,但SoundPool本身由於內存資源申請有嚴格限制,所以在開發過程中,建議盡量用SoundPool來播放一些較短的聲音片段或者音效。
HashMap :HashMap是基於哈希表的Map接口的非同步實現,HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。HashMap的功能是通過“鍵(key)”能夠快速的找到“值”。
實例化SoundPool,然后用HashMap來存儲 播放的音樂id:(這里定義了一個SoundPool類的數組來存儲音頻文件)

-
- soundpool[0].load(this, R.raw.m2, 0)中第一個參數為Context,第2個參數即為資源文件,第3個為音樂的優先級;
- spMap.put(0, soundpool[0].load(this, R.raw.m2, 0))中第一個參數為key值,通過key來找到值,第二參數就是我們要存儲的值;
播放音效:
-
- am為創建聲音管理AudioManager對象;
(這里主要是為正在寫的2048做背景音樂和音效)實現這些之后,我們的app就可以有背景音樂和按鈕音效了;

