2013-08-27 22 views
7

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.

+0

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

+0

Dzięki, sprawdzę OpenSL ES, wygląda dobrze – user2397906

Odpowiedz

6

Tworzenie odtwarzacza Compat że będzie pracować z onCompletionListener do rozpoczęcia następnego gracza jak:

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

gdzieś w czeku konstruktora, jeśli istnieje metoda (lub sprawdzić wersję SDK) o nazwie "setNextMediaPlayer"

mCompatMode = Build.VERSION.SDK_INT < 16;

Należy zdefiniować metodę podobną do tej:

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

Dziękuję za odpowiedź! Czy powinienem to zrobić w mojej klasie aktywności, czy też muszę stworzyć klasowy odtwarzacz CompatPlayer, który rozszerza MediaPlayer? – user2397906

+0

To zależy od ciebie, tutaj w odpowiedzi mam klasę, która jest publiczną i prywatną klasą CompatMediaPlayer, mają one ten sam kompletny słuchacz (wewnętrzny i dostarczają nawet aktywności, jeśli są). Dlatego mam 'super.setNextMediaPlayer()' –

+0

Rozumiem, że ma to sens. Jednak teraz mam problem z dodaniem plików audio do mediaplayerów. Dokonałem edycji mojego pytania za pomocą kodu. Jakieś pomysły? – user2397906

Powiązane problemy