Android中新增背景音樂的兩種方法
阿新 • • 發佈:2018-12-26
前些天在嘗試自己寫一個Android小遊戲——flybird
基本功能實現了,就想新增聲音,然後上網查了查,大多是一樣,可是用到我這,有些卻不可以用,所以我還用了兩種方法。
下面談談這兩種方法。
方法一:這是使用java中的多執行緒,另外new出一個類,用類來啟動音樂。
這個方法,就像當初寫java的小遊戲一樣,不過是在電腦上執行的,可以控制每一個動作,比如你的觸碰動作,但是,在我這個遊戲中,我需要的不是一點的音樂,雖 然後期會用到,而是一開始就有的。
不過,用這個方法,沒用service,就是開起來的時候,會很卡,而且會閃退。
然後,在需要的地方new出類,在呼叫方法。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); } }
方法二:
這種方法是利用Android中的service來開啟,也就是進去的時候就播放出,退出就停止。
首先,在AndroidManifest中的application節點下新增:
然後,再在專案中new出一個類,MusicServer:<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>
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了。