Я работаю над написанием небольшого приложения для потоковой передачи mp3-файлов. Я использую код NPR, но у меня странная проблема с mediaPlayer.prepareAsync ().
Я использую урезанную версию PlaybackService из приложения NPR, которое запускается правильно. Я получаю ссылку на сервис в обработчике OnClick внутри Activity и вызываю listen () с URL-адресом потока MP3. Следующий (упрощенный) код взят из моего PlaybackService:
public void listen(String url) throws IllegalArgumentException, IllegalStateException, IOException {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnInfoListener(this);
mediaPlayer.setOnPreparedListener(this);
synchronized (this) {
mediaPlayer.setDataSource(url);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
}
}
// ... lots of other code
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(LOG_TAG, "Prepared");
play();
}
У меня определены и другие обратные вызовы. Из LogCat я вижу, что MediaPlayer загружает поток и буферизирует, как я вижу следующие сообщения:
AwesomePlayer I calling prefetcher->prepare()
AwesomePlayer I prefetcher is done preparing
Но мой метод onPrepared никогда не вызывается. Если я добавлю таймер и попытаюсь вызвать play () на MediaPlayer в какой-то момент после того, как увижу вышеупомянутые сообщения журнала, проигрыватели мультимедиа воспроизводятся, поэтому он действительно переходит в состояние «Подготовлено».
Если я заменяю вызов prepareAsync () на prepare (), проигрыватель просто работает. Это все на 2.2, который я читал, похоже, есть некоторые проблемы, но проблема, с которой я сталкиваюсь, не кажется связанной, так как поток работает нормально, когда используется prepare ().
Я заметил, что Content-Length в потоке довольно большой (450 МБ), но, поскольку я могу вызывать play на Media Player без получения исключения, похоже, он обрабатывает это ОК.
Единственное другое изменение заключается в том, что в приложении NPR служба привязана и воспроизведение начинается изнутри объекта View (в то время как в моем приложении это происходит внутри Activity).
Есть мысли о том, что я могу делать неправильно?