我最近观察到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的设备上。有谁知道这个问题以及如何处理它?</ p>
答案 0 :(得分:1)
媒体播放器在一个单独的线程中运行,你必须等到ui线程和媒体播放器的线程同步。所以延迟是正常的。由于你的暂停命令太晚到达玩家,玩家可能真的完成了该文件。尝试使用更长的音频文件。
可能出现的另一个问题是在pause-command之后搜索超出轨道末尾的其他代码。听众的代码是什么?