2016-12-02 78 views
1

我有一個鋼琴應用程序使用此方法的工作:媒體播放器與多個MP3文件的問題

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) 

這些錯誤發生在我繼續玩時。但是,當我卸載應用程序,似乎重置,我得到更少的錯誤...爲什麼會發生這種情況,並有解決方案嗎?

回答

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); 
    } 
} 
+0

謝謝您的回答多倫,但我已經在這種應用程序和一個音符的嘗試的Soundpool「殺死」下面,所以你不能聽到以前的聲音直到最後...無論如何,我已經爲我的清單添加了一個許可,並且它的工作似乎更好... – glassraven

+0

SoundPool可以同時播放多個流(看看setMaxStreams()),我想你只用max steams = 1來初始化它。從性能的角度來看,我認爲這對你來說可能是更好的選擇,因爲你不需要在播放之前加載音符。 –

+0

好的,你猜對了,但我的時間表很緊張......我想下一次我會嘗試soundpool – glassraven