一般添加声音是靠两种方法实现的。一种是MediaPlayer,一种是SoundPool。这两种方法的区别是MediaPlayer可以存储较大的音频文件,载入稍慢,不支持同时播放。而SoundPool只能存储较小的音频文件,载入较快,支持同时播放。这样就很显然了,MediaPlayer用来实现背景音乐,而SoundPool用来实现音效。
package my.Game.audio;
import java.io.IOException;
import com.threed.jpct.Logger;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
public class MyMusic {
protected static MediaPlayer mediaPlayer;
protected static boolean mustResume = false;
private static Activity act;
public MyMusic(Activity act){
mediaPlayer = new MediaPlayer();
MyMusic.act=act;
}
public static void prepareMediaPlayer(String file) {
if(mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
AssetFileDescriptor afd = null;
try {
afd = act.getAssets().openFd("sound/"+file+".ogg");
} catch (Exception e) {
e.printStackTrace();
Logger.log("Tried creating Music with missing asset ... " + file);
System.exit(0);
return;
}
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
afd.close();
} catch (IOException e) {
e.printStackTrace();
Logger.log("Error setting data source in Music.play, IO exception");
System.exit(0);
return;
} catch (IllegalStateException e) {
e.printStackTrace();
Logger.log("Error setting data source in Music.play, fail ...");
return;
}
try {
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
Logger.log("Error preparing MediaPlayer");
System.exit(0);
return;
}
}
public static void play(boolean loop) {
if(mediaPlayer == null) {
Logger.log("error:MediaPlayer hasn't prepared.");
return;
}
mediaPlayer.setLooping(loop);
mediaPlayer.start();
}
public static void stop() {
if(mediaPlayer == null) {
Logger.log("error:No mediaPlayer is playing.");
return;
}
mediaPlayer.stop();
}
public static void pause() {
if(mediaPlayer == null) {
Logger.log("error:No mediaPlayer is playing.");
return;