Ho pubblicato di recente un'applicazione e gli utenti segnalano arresti anomali perché il mio programma ha incluso il metodo setNextMediaPlayer()
. Ora mi rendo conto che questo funziona solo per API 16+ e la mia app supporta API 8+. Mi stavo chiedendo se esiste un modo alternativo per ottenere lo stesso effetto.Android MediaPlayer setNextMediaPlayer() alternativo
La mia app ha una sintesi vocale, e quello che stavo facendo era creare uno ArrayList
di MediaPlayers
, ognuno con un breve file audio e quindi riprodurli uno dopo l'altro. Se rimuovo questo metodo dal codice, l'audio diventa troppo mosso per capire.
Stavo pensando di utilizzare la classe SoundPool
, ma non c'è lo OnCompleteListener
, quindi non sono sicuro di come lo farei.
Quindi la mia domanda è: C'è un modo per passare senza problemi tra i file audio senza utilizzare il metodo setNextMediaPlayer()
?
Grazie mille per il vostro tempo!
EDIT
ho aggiunto questo codice che ho trovato
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);
}
}
Ma ora come faccio ad aggiungere i file audio? Ho provato questo:
// 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)));
}
ma sono sempre un'eccezione calco perché MediaPlayer non può essere colato a CompatMediaPlayer.
Se sei disposto a gestire la decodifica nella tua app (o spedisci i file audio come PCM non codificato) potresti utilizzare l'API 'AudioTrack' o OpenSL ES. – Michael
Grazie, controllerò l'OpenSL ES, sembra buono – user2397906