2013-08-27 1 views
7

Недавно я опубликовал приложение, и пользователи сообщают о сбоях, потому что моя программа включала метод setNextMediaPlayer(). Теперь я понимаю, что этот работает только для API 16+, а мое приложение поддерживает API 8+. Мне было интересно, есть ли альтернативный способ достижения такого же эффекта.Android MediaPlayer setNextMediaPlayer() alternative

У моего приложения есть текст в речь, и то, что я делал, создавало ArrayList из MediaPlayers, каждый из которых имел короткий звуковой файл, а затем воспроизводил их один за другим. Если я удалю этот метод из кода, звук станет слишком изменчивым, чтобы понять.

Я думал об использовании класса SoundPool, но нет OnCompleteListener, поэтому я не уверен, как я это сделаю.

Итак, в основном, мой вопрос: Есть ли способ беспрепятственного перехода между аудиофайлами без использования метода setNextMediaPlayer()?

Большое спасибо за ваше время!

EDIT

Я добавил этот код, который я нашел

private class CompatMediaPlayer extends MediaPlayer implements OnCompletionListener { 

    private boolean mCompatMode = true; 
    private MediaPlayer mNextPlayer; 
    private OnCompletionListener mCompletion; 

    public CompatMediaPlayer() { 
     try { 
      MediaPlayer.class.getMethod("setNextMediaPlayer", MediaPlayer.class); 
      mCompatMode = false; 
     } catch (NoSuchMethodException e) { 
      mCompatMode = true; 
      super.setOnCompletionListener(this); 
     } 
    } 

    public void setNextMediaPlayer(MediaPlayer next) { 
     if (mCompatMode) { 
      mNextPlayer = next; 
     } else { 
      super.setNextMediaPlayer(next); 
     } 
    } 

    @Override 
    public void setOnCompletionListener(OnCompletionListener listener) { 
     if (mCompatMode) { 
      mCompletion = listener; 
     } else { 
      super.setOnCompletionListener(listener); 
     } 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     if (mNextPlayer != null) { 
      // as it turns out, starting a new MediaPlayer on the completion 
      // of a previous player ends up slightly overlapping the two 
      // playbacks, so slightly delaying the start of the next player 
      // gives a better user experience 
      SystemClock.sleep(50); 
      mNextPlayer.start(); 
     } 
     mCompletion.onCompletion(this); 
    } 
} 

Но теперь, как я могу добавить аудиофайлы? Я попытался это:

 // assigns a file to each media player 
    mediaplayers = new ArrayList<CompatMediaPlayer>(); 
    for (int i = 0; i < files.size(); i++) { 
     mediaplayers.add((CompatMediaPlayer) CompatMediaPlayer.create(this, files.get(i))); 
    } 

, но я получаю исключение в классе бросок, потому что MediaPlayer не может быть преобразована в CompatMediaPlayer.

+0

Если вы хотите обработать декодирование в своем приложении (или отправить аудиофайлы в виде незарегистрированного PCM), вы можете использовать API AudioTrack или OpenSL ES. – Michael

+0

Спасибо, я проверю OpenSL ES, он хорошо выглядит – user2397906

ответ

6

Создать Compat плеер, который будет работать с onCompletionListener, чтобы начать следующий игрок, как:

public void onCompletion(MediaPlayer mp) { 
    if (mCompatMode && mNextPlayer != null) { 
     mNextPlayer.prepare(); 
     mNextPlayer.start(); 
    } 
} 

Где-то в чеке конструктора, если есть метод (или проверить SDK версии) под названием "setNextMediaPlayer"

mCompatMode = Build.VERSION.SDK_INT < 16;

Определить метод, подобный этому:

public void setNextMediaPlayer(MediaPlayer next) { 
    if (mCompatMode) { 
     mNextPlayer = next; 
    } else { 
     super.setNextMediaPlayer(next); 
    } 
} 
+0

Спасибо за ваш ответ! Должно ли это выполняться в моем классе активности или мне нужно создать класс CompatPlayer, который расширяет MediaPlayer? – user2397906

+0

Это зависит от вас, здесь, в ответе, у меня есть класс, который является общедоступным и приватным классом класса CompatMediaPlayer, у тех, кто имеет один и тот же прослушиватель завершения (внутренний, и обеспечивает даже активность, если таковые имеются). Вот почему у меня есть 'super.setNextMediaPlayer()' –

+0

Я вижу, это имеет смысл. Однако теперь мне не удается добавить аудио файлы в медиаплееры. Я редактировал свой вопрос с помощью кода. Есть идеи? – user2397906