2013-08-27 52 views
7

Son zamanlarda bir uygulama yayınladım ve programım setNextMediaPlayer() yöntemini içerdiğinden kullanıcılar çökmeleri bildiriyor. Şimdi bu 'un yalnızca API 16+ için çalıştığını ve uygulamasının API 8+'u desteklediğini anlıyorum. Aynı etkiyi elde etmenin alternatif bir yolu olup olmadığını merak ediyordum.Android MediaPlayer setNextMediaPlayer() alternatif

Uygulamamın konuşması için bazı metinleri var ve yaptığım şeylerin her biri kısa bir ses dosyası olan ArrayList ile ArrayList oluşturuyordu ve sonra bunları birbiri ardına oynatıyordu. Bu yöntemi koddan kaldırırsam, sesin anlaşılması çok kesicidir.

SoundPool sınıfını kullanmayı düşünüyordum, ancak OnCompleteListener yok, bu yüzden nasıl yapacağımı bilmiyorum.

Temel olarak sorum şu: setNextMediaPlayer() yöntemini kullanmadan ses dosyaları arasında sorunsuz geçiş yapmanın bir yolu var mı?

Zaman ayırdığınız için çok teşekkürler!

DÜZENLEME

ben

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); 
    } 
} 

Ama şimdi ses dosyaları eklemek nasıl bulundu bu kodu eklendi? Bu çalıştı:

 // 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))); 
    } 

ama MediaPlayer CompatMediaPlayer için demir edilemez çünkü bir sınıf dökme istisna alıyorum.

+0

Uygulamanızdaki kod çözmeyi yürütmeye (veya ses dosyalarını kodlanmamış PCM olarak göndermeye) istekliyseniz, 'AudioTrack' veya OpenSL ES API'sini kullanabilirsiniz. – Michael

+0

Teşekkürler, ben OpenSL ES kontrol edecek, iyi görünüyor – user2397906

cevap

6

gibi sonraki oyuncu başlatmak için onCompletionListener birlikte çalışacaktır Compat oyuncu oluşturun: adlandırılmış bir yöntem varsa sizin yapıcı kontrol altında

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

Somewhere (veya SDK sürümünü kontrol) "setNextMediaPlayer"

mCompatMode = Build.VERSION.SDK_INT < 16;

Bunun gibi bir yöntemi tanımlayın:

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

Cevabınız için teşekkürler! Bu benim etkinlik sınıfımda mı yoksa MediaPlayer'ı genişleten bir sınıf CompatPlayer mı oluşturmalıyım? – user2397906

+0

Bu size kalmış, burada cevap olarak, public ve private CompatMediaPlayer sınıfı olan bir sınıfım var, bunlar aynı tamamlama dinleyicisini paylaşıyorlar (iç, ve eğer varsa aktiviteye bile olsa). İşte bu yüzden super.setNextMediaPlayer() ' –

+0

görüyorum, bu mantıklı. Ancak şimdi ses dosyalarını mediaplayers'a eklemekte sorun yaşıyorum. Koduyla soruma bir değişiklik yaptım. Herhangi bir fikir? – user2397906