我有一个使用这种方法的钢琴应用程序:
public void play(String note) {
score++;
score();
try {
mp = MediaPlayer.create(this, getResources().getIdentifier(note, "raw", getPackageName()));
mp.start();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer media) {
media.release();
}
});
} catch (Exception e) {
Log.e("Error", "error playing file : " + note + "\n" + e);
}
}
问题在于,如果我按键过快,有几次我会收到这样的错误:
E/MediaPlayer: error (1, -19)
这些错误在我继续播放时发生。但是当我卸载应用程序时,某些东西似乎重置了,我得到的错误更少......为什么会发生这种情况并且有解决方案呢?
答案 0 :(得分:1)
由于您的代码暗示您正在播放音符而不是长MP3,我建议您使用SoundPool
代替MediaPlayer
。它更适合这种应用,因为它预先加载所有资源。
这种实施的一个例子:
private SoundPool soundPool;
private HashMap<String, Integer> soundNameToSoundIdMap;
private void initSoundMap() {
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
soundNameToSoundIdMap = new HashMap<String, Integer>();
soundNameToSoundIdMap.put("note_a", loadSound(getContext(), R.raw.note_a));
soundNameToSoundIdMap.put("note_b", loadSound(getContext(), R.raw.note_b));
}
private int loadSound(Context context, int resId) {
return soundPool.load(context, resId, 1);
}
public void play(String note) {
score++;
score();
Integer soundId = soundNameToSoundIdMap.get(note);
if (soundId != null){
soundPool.play(soundId.intValue(), 100, 100, 1, 0, 0);
}
}