Ostatnio opublikowałem aplikację, a użytkownicy zgłaszają awarie, ponieważ mój program zawierał metodę setNextMediaPlayer()
. Teraz zdaję sobie sprawę, że ta działa tylko dla interfejsu API 16+, a moja aplikacja obsługuje interfejs API 8+. Zastanawiałem się, czy istnieje alternatywny sposób osiągnięcia tego samego efektu.Zestaw Android MediaPlayerNextMediaPlayer() alternatywa
Moja aplikacja ma trochę tekstu na mowę, a to, co robiłem, polegało na utworzeniu ArrayList
z MediaPlayers
, w którym każdy miał krótki plik dźwiękowy, a następnie odtwarzał je jeden po drugim. Jeśli usuniemy tę metodę z kodu, dźwięk stanie się zbyt niepewny, aby to zrozumieć.
Myślałem o używaniu klasy SoundPool
, ale nie ma OnCompleteListener
, więc nie jestem pewien, jak bym to zrobił.
Moje pytanie brzmi: Czy istnieje sposób płynnego przejścia między plikami audio bez korzystania z metody setNextMediaPlayer()
?
Dziękuję bardzo za poświęcony czas!
EDIT
dodałem ten kod, który znalazłem
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);
}
}
ale teraz jak mogę dodać pliki audio? Próbowałem tego:
// 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)));
}
ale otrzymuję wyjątek odlewu klasowego, ponieważ MediaPlayer nie może być rzutowany na CompatMediaPlayer.
Jeśli chcesz obsługiwać dekodowanie w swojej aplikacji (lub wysyłać pliki audio jako niekodowane PCM), możesz użyć 'AudioTrack' lub OpenSL ES API. – Michael
Dzięki, sprawdzę OpenSL ES, wygląda dobrze – user2397906