我的SoundPool有点困难。我的ArrayList<Integer>
我的soundID位于我的res/raw
文件夹中。我在我的ViewHolder类中为我的RecyclerView创建了SoundPool:
//create the SoundPool
sp = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
//create the AudioManager for managing volume
audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
//store the streamVolume in an int
streamVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
//set the load listener for my soundfiles
sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
loaded = true;
}
});
我正在点击ImageView播放声音,如下所示:
@Override
public void onClick(View v) {
if (v.equals(cardImg)) {
sp.load(context, cardData.getSoundId(), 1);
if (loaded) {
sp.play(cardData.getSoundId(), streamVolume, streamVolume, 1, 0, 1f);
}
}
}
每次点击cardImg
时,都会出现此错误:
W/SoundPool﹕ sample 2130968609 not READY
样本int的变化取决于我点击的卡片,就像它应该的那样。
所以我知道它从我的ArrayList获取了正确的soundID(存储在CardData
类中),并且肯定看到它被加载了,因为它不会尝试否则,因为loaded
永远不会成真。我的问题是:为什么我的声音从未准备好?
我的声音是.m4a
格式,Android表示文档支持这种格式。我尝试使用Android 5.0设备和Android 4.4设备,但没有任何变化。
我尝试使用MediaPlayer
,但我遇到了内存错误,因为我有很多需要能够发送垃圾邮件的短片,而且我读到SoundPool是一种更好的方法来管理它(? )。
任何帮助将不胜感激!我在这里超级高兴。
答案 0 :(得分:3)
您使用的是错误的ID。 SoundPool.load
会返回一个假设要传递给SoundPool.play
的ID。