【发布时间】:2015-03-10 00:15:59
【问题描述】:
我的 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(存储在 CardData 类中)获取正确的 soundID,并且它肯定会看到它已加载,因为它不会尝试播放,因为 loaded 永远不会是真的。我的问题是:为什么我的声音还没有准备好?
我的声音是.m4a 格式,Android 说文档中支持这种格式。我在 Android 5.0 设备和 Android 4.4 设备上进行了尝试,但没有任何变化。
我曾尝试使用MediaPlayer,但我遇到了内存错误,因为我有许多短片需要被发送垃圾邮件,而且我读到 SoundPool 是一种更好的管理方式(?)。
任何帮助将不胜感激!我在这里超级烦恼。
【问题讨论】: