我最近观察到MediaPlayer播放mp3文件时出现了一个非常奇怪的问题。我运行这段代码(mPlayer
是MediaPlayer的):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
登录),超过300毫秒后,pause()
回电!
结果是媒体播放器在我不期望的时候进入PlaybackCompleted状态。这就搞砸了我的代码的行为(以及start()
,它从头开始重新开始,而不是播放文件的最后一点)。
这发生在从1.6到2.3的仿真器上以及至少一个运行2.2的设备上。有谁知道这个问题,该怎么办?
我很害怕这样的事情,尽管350毫秒似乎是应用程序和媒体播放器之间的巨大延迟。音频文件的长度不是问题...它是多么接近最终用户试图暂停它。 (就我而言,这听起来像音频播放在结束之前被切断,但我不能肯定地说,因为从结尾暂停超过1/4秒没有问题)。我的完成中的监听器非常简单:它会检查一个字段,指出我的代码认为玩家应该进入的状态,并在出现差异时记录警告。没有其他代码寻求;我也记录了这一点。 – 2011-05-29 02:32:14
如果用户暂停音频会发生什么让我们说从头到尾5s?你在这里做什么?你是否也收到完成的电话? – marsbear 2011-05-29 08:56:10
一切都按预期行事。在我的发布代码完成后,我将内部标志设置为表明我暂停了播放器,没有收到完成通知,并且在我调用start()时,它会从暂停的位置恢复。只有在非常接近声音文件末尾时才会发生这种情况。 – 2011-05-29 14:12:38