此问题与this one有关。
我设法修改我的代码以使用SoundPool而不是AudioManager。知道它或多或少有效。
public class Sound {
private static boolean sound = true;
private static final int EAT_SOUND = 1;
private static final int SHORT_EAT_SOUND = 2;
private static final int EAT_CHERRY_SOUND = 3;
private static final int EAT_GHOST_SOUND = 4;
private static final int EXTRA_LIVE_SOUND = 5;
private static final int INTERMISSION_SOUND = 6;
private static final int OPENING_SOUND = 7;
private static final int PACMAN_DIES_SOUND = 8;
private static final int SIREN_SOUND = 9;
private static Context context;
private static SoundPool soundPool;
private static HashMap<Integer, Integer> soundPoolMap;
public static void initializeOpenSound(Context con) {
context = con;
soundPool = new SoundPool(2, AudioManager.STREAM_RING, 100);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(OPENING_SOUND, soundPool.load(context, R.raw.opening_song, 1));
}
public static void initializeSounds() {
soundPoolMap.put(EAT_SOUND, soundPool.load(context, R.raw.eating, 1));
soundPoolMap.put(SHORT_EAT_SOUND, soundPool.load(context, R.raw.eating_short, 1));
soundPoolMap.put(EAT_CHERRY_SOUND, soundPool.load(context, R.raw.eating_cherry, 1));
soundPoolMap.put(EAT_GHOST_SOUND, soundPool.load(context, R.raw.eating_ghoasts, 1));
soundPoolMap.put(EXTRA_LIVE_SOUND, soundPool.load(context, R.raw.extra_lives, 1));
soundPoolMap.put(INTERMISSION_SOUND, soundPool.load(context, R.raw.intermission, 1));
soundPoolMap.put(PACMAN_DIES_SOUND, soundPool.load(context, R.raw.pac_man_dies, 1));
soundPoolMap.put(SIREN_SOUND, soundPool.load(context, R.raw.siren, 1));
}
private static void playSound(int sound) {
int streamID = soundPool.play(soundPoolMap.get(sound), 0.5f, 0.5f, 1, 0, 1f);
if (sound == OPENING_SOUND) {
soundPool.setLoop(streamID, 2);
}
}
public static void playSirenSound() throws SoundInitializationError {
if (isSoundOn()) {
if (soundPoolMap.containsKey(SIREN_SOUND)) {
System.out.println("Play Siren sound");
playSound(SIREN_SOUND);
} else {
throw new SoundInitializationError("Siren Sound not initialized!");
}
}
}
public static void playPacmanDiesSound() throws SoundInitializationError {
if (isSoundOn()) {
if (soundPoolMap.containsKey(PACMAN_DIES_SOUND)) {
System.out.println("Play Pacman Dies sound");
playSound(PACMAN_DIES_SOUND);
} else {
throw new SoundInitializationError("Pacman Dies Sound not initialized!");
}
}
}
public static void playOpeningSound() throws SoundInitializationError {
if (isSoundOn()) {
if (soundPoolMap.containsKey(OPENING_SOUND)) {
System.out.println("Play Opening sound");
playSound(OPENING_SOUND);
} else {
throw new SoundInitializationError("Opening Sound not initialized!");
}
}
}
public static void playIntermissionSound() throws SoundInitializationError {
if (isSoundOn()) {
if (soundPoolMap.containsKey(INTERMISSION_SOUND)) {
System.out.println("Play Intermission sound");
playSound(INTERMISSION_SOUND);
} else {
throw new SoundInitializationError("Intermission Sound not initialized!");
}
}
}
public static void playExtraLiveSound() throws SoundInitializationError {
if (isSoundOn()) {
if (soundPoolMap.containsKey(EXTRA_LIVE_SOUND)) {
System.out.println("Play Extra Live sound");
playSound(EXTRA_LIVE_SOUND);
} else {
throw new SoundInitializationError("Extra Live Sound not initialized!");
}
}
}
public static void playEatSound() throws SoundInitializationError {
if (isSoundOn()) {
if (soundPoolMap.containsKey(EAT_SOUND)) {
System.out.println("Play Eat Sound");
playSound(EAT_SOUND);
} else {
throw new SoundInitializationError("Eat Sound not initialized!");
}
}
}
public static void playShortEatSound() throws SoundInitializationError {
if (isSoundOn()) {
if (soundPoolMap.containsKey(SHORT_EAT_SOUND)) {
System.out.println("Play Short Eat sound");
playSound(SHORT_EAT_SOUND);
} else {
throw new SoundInitializationError("Short Eat Sound not initialized!");
}
}
}
public static void playEatCherrySound() throws SoundInitializationError {
if (isSoundOn()) {
if (soundPoolMap.containsKey(EAT_CHERRY_SOUND)) {
System.out.println("Play Eat Cherry sound");
playSound(EAT_CHERRY_SOUND);
} else {
throw new SoundInitializationError("Eat Cherry Sound not initialized!");
}
}
}
public static void playEatGhostSound() throws SoundInitializationError {
if (isSoundOn()) {
if (soundPoolMap.containsKey(EAT_GHOST_SOUND)) {
System.out.println("Play Eat Ghost sound");
playSound(EAT_GHOST_SOUND);
} else {
throw new SoundInitializationError("Eat Ghost Sound not initialized!");
}
}
}
public static boolean isSoundOn() {
return sound;
}
public static void setSoundOn(boolean b) {
sound = b;
}
}
但是,我有一个或多或少的大音频文件,我想在启动时播放。但是,如果我调用initializeOpenSound()然后调用playOpening Sound(),那么声音就不会播放并且logcat输出:
07-15 09:11:02.121: WARN/SoundPool(14273): sample 1 not READY
在SDK 2.2中,我会使用SoundPool.OnLoadCompleteListener但是如何使用SDK 2.1实现相同的目标?
编辑:我也很高兴找到一个不包含监听器或类似内容的解决方案,但要么尝试播放声音文件,直到成功为止。
答案 0 :(得分:1)
如果您在初始化后尝试播放声音,我已经阅读过,它将无法准备好您将收到此错误。你可以制作一个加载页面,等待几秒钟,直到你确定声音已加载。
还要确保您的文件大小不超过1048576字节,这是Soundpool的限制。如果你想播放背景音乐或其他我认为你必须使用媒体播放器。
答案 1 :(得分:1)
我为OnLoadCompleteListener实施了一个回复实现,我发布了here。