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

Android 为什么第一次播放媒体时会触发MediaPlayer OnCompletion?,android,media-player,Android,Media Player,我花了很多时间试图弄明白这一点: 首次加载并启动MediaPlayer时,将调用其OnCompletion。这是一个问题,因为我有一些代码在上一个曲目结束时会跳到下一个曲目 我在OnCompletion侦听器中使用了一个标志来解决这个问题,但为什么会这样呢 此代码段来自“我的服务”中的play()方法: mp.setDataSource(mCurrentMediaFile); mp.prepare(); mDuration = mp.getDura

我花了很多时间试图弄明白这一点:

首次加载并启动MediaPlayer时,将调用其OnCompletion。这是一个问题,因为我有一些代码在上一个曲目结束时会跳到下一个曲目

我在OnCompletion侦听器中使用了一个标志来解决这个问题,但为什么会这样呢

此代码段来自“我的服务”中的play()方法:

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

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

在提供的代码中,我看到这种行为的唯一原因是行
int seek=mDuration*position/1000中的错误寻道值。注销该值以将其签出。

您应该尝试将mp.seekTo代码放入onPrepared回调中。如果seek值在onPrepared回调之前生效,那么MediaPlayer将重置seek值。最后,在知道要查找的位置之前,需要正确缓冲媒体。onPrepared回调确保了这一点


希望有帮助

嗨,你发现这里有什么问题吗?我也有类似的问题。oncmletion是在mp.reset()之后调用的@vandzi:不,不是真的。我在onCompletion处理程序中使用带有标志的变通方法。您还可以检查时间,这样如果在启动(或重置)后500毫秒调用处理程序,代码将被跳过。