一般的Android應用程式的音樂可以分為背景音樂和點擊各種控制項時的音效,前者一般為比較大的音樂檔案,後者一般為比較小的音樂。在Android中一般用MediaPlayer類處理比較大的音頻檔案,用SoundPool類處理比較短促的音頻檔案。
因此,現設計一音樂播放工具類如下: MusicPlayer
import android.content.Context;<br />import android.media.AudioManager;<br />import android.media.MediaPlayer;<br />import android.media.SoundPool; </p><p>import com.ruanko.shengji4Android.R;<br />import com.ruanko.shengji4Android.model.SysSetting; </p><p>public class MusicPlayer implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {<br /> private Context context;<br /> private MediaPlayer bgPlayer; //播放背景音樂的播放器<br /> private SoundPool actionMusicPlayer; //播放音效的播放器<br /> private int source_da,source_givecard,source_start,source_win,source_calllord; //各種音效的source </p><p> public MusicPlayer(Context context) { //初始化<br /> this.context = context;<br /> this.actionMusicPlayer = new SoundPool(10, AudioManager.STREAM_SYSTEM,5); //這裡指定聲音池的最大音頻流數目為10,聲音品質為5大家可以自己測試感受下效果<br /> this.source_da = actionMusicPlayer.load(context, R.raw.da, 0);<br /> this.source_givecard = actionMusicPlayer.load(context, R.raw.givecard, 0);<br /> this.source_start = actionMusicPlayer.load(context, R.raw.start, 0);<br /> this.source_win = actionMusicPlayer.load(context, R.raw.win, 0);<br /> this.source_calllord = actionMusicPlayer.load(context, R.raw.calllord, 0);<br /> } </p><p> public void onCompletion(MediaPlayer mp) { //音頻檔案播放完成時自動調用 </p><p> } </p><p> public boolean onError(MediaPlayer mp, int what, int extra) { //音頻檔案播放發生錯誤時自動調用<br /> return false;<br /> } </p><p> public void playBgSound(int paramInt) { //播放背景音樂,paramInt為音頻檔案ID<br /> if(!SysSetting.getInstance(context).isBgSound()) { //SysSetting為一個單例類,是我自己定義的,用於儲存本應用程式相關設定,isBgSound()為得到是否開啟背景音樂設定<br /> return;<br /> } </p><p> stopSound(bgPlayer); </p><p> try {<br /> MediaPlayer mediaPlayer = MediaPlayer.create(context, paramInt);<br /> bgPlayer = mediaPlayer;<br /> bgPlayer.setOnCompletionListener(this);<br /> bgPlayer.setLooping(true); //設定是否迴圈,一般背景音樂都設為true<br /> bgPlayer.start();<br /> } catch (IllegalStateException e) {<br /> e.printStackTrace();<br /> }<br /> } </p><p> public MediaPlayer getBackGroundPlayer() {<br /> return this.bgPlayer;<br /> } </p><p> public void stopBgSound() { //停止背景音樂的播放<br /> if(bgPlayer == null)<br /> return;<br /> if(bgPlayer.isPlaying())<br /> bgPlayer.stop();<br /> bgPlayer.release();<br /> bgPlayer = null;<br /> } </p><p> private void playSound(int source) { //如果系統設定中開啟了音效,則播放相關的音頻檔案<br /> if(SysSetting.getInstance(context).isEffectSound()) {<br /> actionMusicPlayer.play(source, 1, 1, 0, 0, 1);<br /> }<br /> } </p><p> public void playHitCardSound() {<br /> playSound(source_da);<br /> } </p><p> public void playGiveCardSound() {<br /> playSound(source_givecard);<br /> } </p><p> public void playStartSound() {<br /> playSound(source_start);<br /> } </p><p> public void playWinSound() {<br /> playSound(source_win);<br /> } </p><p> public void playCalllordSound() {<br /> playSound(source_calllord);<br /> }<br />}<br />
在activity中怎樣使用這個工具類呢?播放背景音樂可能我們一般都想到的是service,但是service對背景音樂的控制比較難,尤其是,在不同情境,需要不時變換背景音樂的情況下,因此,可以考慮自己定義一個activity,繼承Activity,在其中定義一個靜態成員變數
- public static MusicPlayer musicPlayer;
並在這個Activity的onCreate方法中初始化該musicPlayer
- if(musicPlayer == null) {
- SysSetting.getInstance(getApplicationContext()).load(); //載入系統設定,SysSetting為我自己定義的一個類,由於代碼較長,就不給出了
- musicPlayer = new MusicPlayer(getApplicationContext());
- musicPlayer.playBgSound(R.raw.welcome); //播放背景音樂
- }
然後,再將所有的Activity繼承於這個自己定義的Activity即可。