2013-06-21 2 views
5

В моем приложении я создал аудиоплеер (только WAV-файлы) с использованием API MediaPlayer. Но игрок не дает обратного вызова onCompletion Listener каждый раз. Иногда это дает обратный вызов, но не каждый раз. Я делаю некоторую обработку звука в wav-файле, например, вставку и перезапись.MediaPlayer onCompletion не называется точно

Это из-за отсутствия в звуковом заголовке каких-либо недостатков? Почему это не дает обратного вызова, когда воспроизведение завершено?

ответ

5

Убедитесь, что заголовки файла установлены правильно. Если что-то в заголовке отсутствует callback на onCompletion может не произойти.

Если медиаплеер играет в файл .wav, поиск может произойти правильно, но подергивание будет там. Поэтому, когда воспроизведение будет завершено, будет отличаться от 0 до 1000 мс между общей продолжительностью файла и onCompletion соответственно. Поэтому, если такая ситуация наступит, вы должны догадаться, что как onColmpletion и делать то, что вы хотели. Это немного сложный способ получить onCompletion.

Я столкнулся с той же проблемой при воспроизведении файла .wav с медиаплеер. Это не очень хороший способ решить эту проблему, но я столкнулся с такой же проблемой, как и в случае такой ситуации. Надеюсь, это поможет вам в некоторых отношениях.

0

Вы используете правильный метод, но передали ли вы какой-либо код в «// выполняем некоторые задачи здесь, когда воспроизведение завершается» AREA.

Если нет, то обратный вызов не имеет никакого смысла.

mMediaPlayer.setOnCompletionListener(new OnCompletionListener() { 

    public void onCompletion(MediaPlayer mp) { 

     Toast.makeText(getApplicationContext(),"Playback Completes", Toast.LENGTH_SHORT).show(); 
    } 
}); 

Этот метод выдает тост по завершении воспроизведения.

-2

Попробуйте использовать метод сна после завершения записи. Также использовать; .prepare() перед возвратом, чтобы избежать сбоев.

0

Для вызова функции onCompletion() вы должны отключить цикл с вызовом mediaPlayer.setLooping (false);

0

Убедитесь, что MediaPlayer не является локальной (временной) переменной. Поскольку локальная переменная будет собрана GC. В этом случае функция onCompletion не будет иметь возможности для вызова.

0

Возвращение верно для OnErrorListner метод на MediaPlayer

@Override 
public boolean onError(MediaPlayer mp, int what, int extra) { 
    //Invoked when there has been an error during an asynchronous operation 
    switch (what) { 
     case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK: 
      Log.e("MediaPlayer Error", "MEDIA ERROR NOT VALID FOR PROGRESSIVE PLAYBACK " + extra); 
      break; 
     case MediaPlayer.MEDIA_ERROR_SERVER_DIED: 
      Log.e("MediaPlayer Error", "MEDIA ERROR SERVER DIED " + extra); 
      break; 
     case MediaPlayer.MEDIA_ERROR_UNKNOWN: 
      Log.e("MediaPlayer Error", "MEDIA ERROR UNKNOWN " + extra); 
      break; 
    } 
    return true; 
}