Недавно я опубликовал приложение, и пользователи сообщают о сбоях, потому что моя программа включала метод 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.
Если вы хотите обработать декодирование в своем приложении (или отправить аудиофайлы в виде незарегистрированного PCM), вы можете использовать API AudioTrack или OpenSL ES. – Michael
Спасибо, я проверю OpenSL ES, он хорошо выглядит – user2397906