2011-05-29 146 views
3

我最近观察到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的设备上。有谁知道这个问题,该怎么办?

回答

1

mediaplayer运行在一个单独的线程,你必须等到ui线程和mediaplayer的线程同步。所以延迟是正常的。玩家可能真的完成了文件,因为你的暂停命令太迟到达了玩家。试试更长的音频文件会发生什么。

可能出现的另一个问题是其他代码在暂停命令后寻找超出轨道末尾的代码。听众的代码是什么?

+0

我很害怕这样的事情,尽管350毫秒似乎是应用程序和媒体播放器之间的巨大延迟。音频文件的长度不是问题...它是多么接近最终用户试图暂停它。 (就我而言,这听起来像音频播放在结束之前被切断,但我不能肯定地说,因为从结尾暂停超过1/4秒没有问题)。我的完成中的监听器非常简单:它会检查一个字段,指出我的代码认为玩家应该进入的状态,并在出现差异时记录警告。没有其他代码寻求;我也记录了这一点。 – 2011-05-29 02:32:14

+0

如果用户暂停音频会发生什么让我们说从头到尾5s?你在这里做什么?你是否也收到完成的电话? – marsbear 2011-05-29 08:56:10

+0

一切都按预期行事。在我的发布代码完成后,我将内部标志设置为表明我暂停了播放器,没有收到完成通知,并且在我调用start()时,它会从暂停的位置恢复。只有在非常接近声音文件末尾时才会发生这种情况。 – 2011-05-29 14:12:38