一千萬個為什麽

搜索

暫停後MediaPlayer完成

我最近觀察到MediaPlayer播放mp3文件時出現了一個非常奇怪的問題。我正在運行此代碼( mPlayer 是一個MediaPlayer):

Log.d(TAG, "Pausing");
try {
    mPlayer.pause();
    Log.d(TAG, "Paused");
} catch (IllegalStateException e) {
    Log.w(TAG, "exception pausing player");
}

奇怪的是,如果我接近音頻文件的末尾,播放器會在上述代碼完成後短時間向我的 OnCompletionListener 發送完成通知。 (我沒有確切地知道我有多接近,但它大約是1/4秒。)例如,這是發生這種情況時的典型logcat輸出:

05-27 17:23:43.439: DEBUG/Player(266): Pausing
05-27 17:23:43.487: DEBUG/Player(266): Paused
05-27 17:23:43.838: WARN/Player(266): Audio completed (state=PAUSED)

請註意,警告行(從我的 OnCompletionListener 記錄)在返回 pause()後超過300毫秒!

結果是媒體播放器在我不期望它時進入PlaybackCompleted狀態。這搞砸了我的代碼行為(以及 start(),它從頭開始重新啟動,而不是播放文件的最後一點)。

這種情況發生在從1.6到2.3的仿真器上以及至少一個運行2.2的設備上。有誰知道這個問題,怎麽辦呢?

最佳答案

媒體播放器在一個單獨的線程中運行,你必須等到ui線程和媒體播放器的線程同步。所以延遲是正常的。由於你的暫停命令到達玩家太晚,玩家可能真的完成了文件。嘗試使用更長的音頻文件。

可能出現的另一個問題是在pause-command之後搜索超出軌道末尾的其他代碼。你的聽眾代碼是什麽?

轉載註明原文: 暫停後MediaPlayer完成