为什么第一次播放媒体时会触发MediaPlayer OnCompletion事件?

4

我花了很多时间来解决这个问题:

当MediaPlayer第一次被加载和启动时,它的OnCompletion会被调用。这是一个问题,因为我有一些代码,当上一首歌曲播放完毕时,它会跳到下一首。

我通过在OnCompletion监听器中使用一个flag来解决了这个问题,但为什么会这样呢?

以下代码片段是我服务中play()方法的一部分:

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

由于某种原因,在从play()方法返回后,即使它是服务创建后播放的第一首曲目,onCompletion也会被调用。


你好,你找到问题了吗?我有类似的问题。OnCompletion 在 mp.reset() 之后被调用。 - Martin Vandzura
@vandzi:不,其实不是。我使用onCompletion处理程序中的标志解决方法。您还可以检查时间,以便如果在启动(或重置)代码后500毫秒调用处理程序,则将跳过代码。 - marlar
3个回答

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

1
你应该尝试将 mp.seekTo 代码放在 onPrepared 回调函数中。如果 seek 值在 onPrepared 回调函数之前生效,MediaPlayer 会重置 seek 值。最后,在确定要寻找的位置之前,媒体需要正确缓冲。onPrepared 回调函数可以确保这一点。
希望能对你有所帮助!

0
在我的情况下,我发现在调用mp.start()之后,mp会抛出一个代码为-38的错误,触发onCompletion回调函数。 要解决这个问题,只需实现onCompletionListener并返回true,如下所示的代码:
mediaPlayer.setOnErrorListener { p0, p1, p2 ->
        Log.d("MP", "Error code: p1 $p1 - p2 $p2")
        true
}

https://developer.android.com/reference/android/media/MediaPlayer.OnErrorListener

返回false,或者根本没有OnErrorListener,将导致OnCompletionListener被调用。

仍然无法理解为什么会发生错误,以及哪个错误具有(-38)的值。难以置信这个问题已经困扰了十多年...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接