【问题标题】:Why is MediaPlayer OnCompletion fired the first time a media is played?为什么第一次播放媒体时会触发 MediaPlayer OnCompletion?
【发布时间】:2011-11-25 21:03:11
【问题描述】:

我花了很多时间试图弄清楚这一点:

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

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

这个 sn-p 来自我服务中的 play() 方法:

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

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

【问题讨论】:

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

标签: android media-player


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多