2013-08-27 19 views
7

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.

+0

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

+0

Grazie, controllerò l'OpenSL ES, sembra buono – user2397906

risposta

6

Crea giocatore Compat che funzionerà con onCompletionListener per iniziare il prossimo giocatore come:

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

Da qualche parte nel vostro check costruttore se non v'è il metodo (o controllare la versione SDK) di nome "setNextMediaPlayer"

mCompatMode = Build.VERSION.SDK_INT < 16;

Definire il metodo come questo:

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

Grazie per la tua risposta! Dovrebbe andare nella mia lezione di attività o devo creare una classe CompatPlayer che estenda MediaPlayer? – user2397906

+0

Spetta a te, qui nella risposta Ho classe che è classe pubblica e privata di CompatMediaPlayer, quelli condividono lo stesso ascoltatore di completamento (interno e forniscono anche all'attività, se presente). Ecco perché ho 'super.setNextMediaPlayer()' –

+0

vedo, questo ha senso. Tuttavia ora ho problemi ad aggiungere i file audio ai mediaplayer. Ho apportato una modifica alla mia domanda con il codice. Qualche idea? – user2397906

Problemi correlati