我怎么知道Soundpool已经准备好使用低于2.2的SDK目标?

这个问题与此问题有关。

我设法修改我的代码以使用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 soundPoolMap; public static void initializeOpenSound(Context con) { context = con; soundPool = new SoundPool(2, AudioManager.STREAM_RING, 100); soundPoolMap = new HashMap(); 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实现相同的function?

编辑:我也很高兴一个解决方案,不包括一个监听器或类似的东西,但要么尝试播放声音文件,直到它成功。

根据我所读到的,如果您在初始化后尝试播放声音,它将无法准备好您将收到此错误。 您可以制作一个加载页面,等待几秒钟,直到您确定声音已加载为止。

还要确保你的文件大小不超过1048576字节,这就是Soundpool的限制。 如果你想播放背景音乐或其他我认为你必须使用媒体播放器。

我在这里发布了OnLoadCompleteListener的回退实现。