1. 程式人生 > >Android中新增背景音樂的兩種方法

Android中新增背景音樂的兩種方法

        前些天在嘗試自己寫一個Android小遊戲——flybird

        基本功能實現了,就想新增聲音,然後上網查了查,大多是一樣,可是用到我這,有些卻不可以用,所以我還用了兩種方法。

        下面談談這兩種方法。

        方法一:這是使用java中的多執行緒,另外new出一個類,用類來啟動音樂。

                     這個方法,就像當初寫java的小遊戲一樣,不過是在電腦上執行的,可以控制每一個動作,比如你的觸碰動作,但是,在我這個遊戲中,我需要的不是一點的音樂,雖               然後期會用到,而是一開始就有的。

                     不過,用這個方法,沒用service,就是開起來的時候,會很卡,而且會閃退。

package com.example.flybird_anla;


import java.util.HashMap;
import java.util.Map;
import java.util.Random;



import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;


public class SoundPlayer {

   private static MediaPlayer music;
   private static SoundPool soundPool;
    
   private static boolean musicSt = true; //音樂開關
   private static boolean soundSt = true; //音效開關
   private static Context context;
    
   private static final int[] musicId = {R.raw.paopao};
   private static Map<Integer,Integer> soundMap; //音效資源id與載入過後的音源id的對映關係表
    
   public static void init(Context c)
   {
       context = c;

       initMusic();
        
       initSound();
   }
    
   //初始化音效播放器
   private static void initSound()
   {
       soundPool = new SoundPool(10,AudioManager.STREAM_MUSIC,100);
        
       soundMap = new HashMap<Integer,Integer>();
       soundMap.put(R.raw.paopao, soundPool.load(context, R.raw.paopao, 1));
       soundMap.put(R.raw.boung, soundPool.load(context, R.raw.boung, 1));
   }
    
   //初始化音樂播放器
   private static void initMusic()
   {
       int r = new Random().nextInt(musicId.length);
       music = MediaPlayer.create(context,musicId[r]);
       music.setLooping(true);
   }
    
   
   public static void playSound(int resId)
   {
       if(soundSt == false)
           return;
        
       Integer soundId = soundMap.get(resId);
       if(soundId != null)
           soundPool.play(soundId, 1, 1, 1, 0, 1);
   }

   /**
    * 暫停音樂
    */
   public static void pauseMusic()
   {
       if(music.isPlaying())
           music.pause();
   }
    
   /**
    * 播放音樂
    */
   public static void startMusic()
   {
       if(musicSt)
           music.start();
   }
    
   /**
    * 切換一首音樂並播放
    */
   public static void changeAndPlayMusic()
   {
       if(music != null)
           music.release();
       initMusic();
       startMusic();
   }
    
   /**
    * 獲得音樂開關狀態
    * @return
    */
   public static boolean isMusicSt() {
       return musicSt;
   }
    
   /**
    * 設定音樂開關
    * @param musicSt
    */
   public static void setMusicSt(boolean musicSt) {
       SoundPlayer.musicSt = musicSt;
       if(musicSt)
           music.start();
       else
           music.stop();
   }

   /**
    * 獲得音效開關狀態
    * @return
    */
   public static boolean isSoundSt() {
       return soundSt;
   }

   /**
    * 設定音效開關
    * @param soundSt
    */
   public static void setSoundSt(boolean soundSt) {
       SoundPlayer.soundSt = soundSt;
   }
    
   /**
    * 發出‘邦’的聲音
    */
   public static void boom()
   {
       playSound(R.raw.boung);
   }
}
            然後,在需要的地方new出類,在呼叫方法。        

方法二:

             這種方法是利用Android中的service來開啟,也就是進去的時候就播放出,退出就停止。

             首先,在AndroidManifest中的application節點下新增:

<activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
            然後,再在專案中new出一個類,MusicServer:
package com.example.flybird_anla;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class MusicServer extends Service {

	private MediaPlayer mediaPlayer;

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);

		if (mediaPlayer == null) {

			// R.raw.mmp是資原始檔,MP3格式的
			mediaPlayer = MediaPlayer.create(this, R.raw.paopao);
			mediaPlayer.setLooping(true);
			mediaPlayer.start();

		}
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		mediaPlayer.stop();
	}
}

最後,在在activity中,寫兩個函式:
protected void onCreate(Bundle savedInstanceState) {
    	Intent intent = new Intent(MainActivity.this,MusicServer.class);
        super.onCreate(savedInstanceState);
        startService(intent);
        manu();
    }
    
    protected void onStop(){
    	Intent intent = new Intent(MainActivity.this,MusicServer.class);
    	stopService(intent);
    	super.onStop();
    	
    }
         然後,就ok了。