MediaPlayer.seekTo()不适用于无缓冲位置

时间:2010-07-09 12:49:14

标签: android media-player

我使用MediaPlayer从网络播放单首mp3歌曲。数据源是HTTP URL。

我们假设我们有以下比赛状态。

歌曲持续时间:1:00

当前进度:0:10

当前缓冲进度0:30

假设我想跳过一首歌的某些部分并向前寻求。我使用MediaPlayer.seekTo()方法。如果我寻求缓冲位置(0:20),它会正确执行。但是如果我寻找一个尚未缓冲的位置(0:40),MediaPlayer表现得很奇怪。它立即表明它已正确搜索而无需等待缓冲区填充。事实上,它继续在寻找之前的同一位置上演奏。从现在开始,MediaPlayer.getCurrentPosition()方法返回错误的位置。当播放到达其结尾并且调用OnCompletionListener.onCompletion回调时,当前媒体播放器位置远高于整个歌曲持续时间。

解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:4)

我找到了解决此问题的方法:

首先创建一个OnBufferingUpdateListener

MediaPlayer.OnBufferingUpdateListener bufferingListener = new MediaPlayer.OnBufferingUpdateListener() {
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        //code to increase your secondary seekbar
    }
};

然后在您的搜索栏事件onProgressChanged中执行以下操作:

public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
    int secondaryPosition = seekBar.getSecondaryProgress();
    if (progress > secondaryPosition)
        seekBar.setProgress(secondaryPosition);
}

通过这种方式,您可以保证用户无法将进度条拖动到无缓冲的位置(还可以看到缓冲的内容)。

答案 1 :(得分:3)

据我所知,某些设备已在Android 2.2中修复过。

然而,Android 2.2因寻求缓冲积极而烦恼不已。虽然已经缓存了一个位置,但MediaPlayer会向服务器发送请求。

答案 2 :(得分:1)

这可能与2.2中最终修复的错误(指其中一条评论)有关 http://code.google.com/p/android/issues/detail?id=4124