Обратные вызовы MediaPlayer не срабатывают после вызова prepareAsync () из Сервиса - PullRequest
2 голосов
/ 01 февраля 2011

Я работаю над написанием небольшого приложения для потоковой передачи 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).

Есть мысли о том, что я могу делать неправильно?

1 Ответ

3 голосов
/ 09 декабря 2011

Убедитесь, что вы создали медиаплеер в потоке с looper , который необходим для правильной работы обратных вызовов.

...