我正试图通过SoundPool
播放2个声音。
以下测试代码使第二次播放没有声音。 只有当我在HTC Hero设备和模拟器上播放无限声音时才会出现这种情况。我使用的是Android 1.6。
...
SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
int soundId1 = soundPool.load(getApplicationContext(), R.raw.sound1, 1);
int soundId2 = soundPool.load(getApplicationContext(), R.raw.sound2, 1);
// the first one plays
int streamId = soundPool.play(soundId1, 1.0f, 1.0f, 1, -1, 1.0f);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
soundPool.stop(streamId);
// the second one doesn't play
streamId = soundPool.play(soundId2, 1.0f, 1.0f, 1, -1, 1.0f);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
soundPool.stop(streamId);
...
答案 0 :(得分:0)
在代码中查看第一个声音的这一行......
int streamId = soundPool.play(sound1, 1.0f, 1.0f, 1, -1, 1.0f);
According to this link,第五个参数定义循环模式。 0 表示无循环, -1 表示永久循环。你的代码说 -1 ,所以第一个声音永远循环,所以第二个声音不会播放。尝试将第一个声音的循环模式更改为无循环,即。 0
编辑:我想我知道你的问题。当您尝试播放声音时,样本尚未就绪,因此,您需要实现 onLoadCompleteListener ,以便样本在准备好后播放。实施例。SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int arg2) {
streamId = soundPool.play(sampleId, 1.0f, 1.0f, 1, -1, 1.0f);
}
});
int soundId1 = soundPool.load(getApplicationContext(), R.raw.tick, 1);
int soundId2 = soundPool.load(getApplicationContext(), R.raw.tock, 1);
现在加载这些声音后,它们将被播放。我测试了这个并且两个声音都播放,因为听众确保在播放之前加载它们。
将此代码集成到您的代码中,它应该可以解决问题。如果没有,请告诉我,我会尝试找到另一种解决方案:)