2011-02-01 148 views
2

我正在編寫一個小型應用程序,它將流式傳輸mp3文件。我正在使用NPR代碼,但mediaPlayer.prepareAsync()有一個奇怪的問題。從服務調用prepareAsync()後MediaPlayer回調不會觸發

我正在從NPR應用程序使用PlaybackService的修剪版本,該版本正確啓動。我正在獲取對Activity中的OnClick處理程序內的服務的引用,並使用URL的MP3流調用listen()。以下(簡化)代碼來自我的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方法不會被調用。如果我在看到上述日誌消息之後添加計時器並嘗試在MediaPlayer上調用play(),媒體播放器將播放,因此它確實進入了準備狀態。

如果我將prepareAsync()調用替換爲prepare(),則該播放器正常工作。這是全部在2.2,我一直在閱讀似乎有一些問題,但我遇到的問題似乎並不相關,因爲使用prepare()時流正常工作。

我確實注意到流上的Content-Length很大(450MB),但由於我可以在Media Player上調用播放而沒有發生異常,因此它似乎在處理這個OK。

唯一的另一個變化是,在NPR應用程序中,服務被綁定到視圖對象內部並開始回放(而在我的應用程序中,這發生在Activity內部)。

有關我可能做錯什麼的想法?

+0

幾乎每次我看到這些錯誤,它似乎都是MediaPlayer無法解釋的低級行爲。 – 2011-02-01 03:51:39

回答

3

確保您已在具有looper的線程中創建媒體播放器,這是回調正常工作所必需的。