2011-09-27 44 views
3

我花了很多时间试图解决这个问题:MediaPlayer OnCompletion为何第一次播放媒体?

当MediaPlayer第一次被加载并启动时,它的OnCompletion被调用。这是一个问题,因为我有一些代码在上一个轨道完成时跳到下一个轨道。

我已经在OnCompletion监听器中使用了一个标志来解决它,但为什么会这样呢?

这个片段是在我服务的play()方法:

 mp.setDataSource(mCurrentMediaFile); 
     mp.prepare(); 
     mDuration = mp.getDuration(); 
     int seek = mDuration * position/1000; 
     mp.seekTo(seek); 
     mp.start(); 

出于某种原因,onCompletion从播放()返回即使它是后正在播放的第一首曲目方法后立即叫服务已创建。

+0

嗨,你发现这里有什么问题吗?我有类似的问题。 OnComletion在mp.reset()之后调用 – vandzi

+0

@vandzi:不,不是。我在onCompletion处理程序中使用了一个解决方法。您也可以检查时间,以便如果在启动(或重置)后500毫秒内调用处理程序,则代码将被跳过。 – marlar

回答

1

在提供的代码中,我看到这种行为的唯一原因是来自行int seek = mDuration * position/1000;的错误查找值。记录该值以检查出来。

1

你应该尝试将你的mp.seekTo代码放在onPrepared回调中。如果搜索值在onPrepared回调之前生效,则搜索值将被MediaPlayer重置。最后,媒体需要在知道要寻求什么位置之前正确地进行缓冲。 onPrepared回调确保了这一点。

希望有帮助!