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.
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
Teşekkürler, ben OpenSL ES kontrol edecek, iyi görünüyor – user2397906