2016-12-02 9 views
1

У меня есть пианино приложение работает с этим методом:Media Player с выпуском несколько 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