Java Android MediaPlayer SeekTo 功能解决方法

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20088782/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 23:02:36  来源:igfitidea点击:

Android MediaPlayer SeekTo function workaround

javaandroidandroid-mediaplayer

提问by Natarajan Raman

I am creating a very simple media player app. I would like to resume the song from the SeekTo position that I have captured using getCurrentPosition. However seekTo does not start from the position I have captured but from the beginning.

我正在创建一个非常简单的媒体播放器应用程序。我想从使用 getCurrentPosition 捕获的 SeekTo 位置恢复歌曲。然而,seekTo 不是从我捕获的位置开始,而是从头开始。

Code to capture current position, pause and change button text to Click to resume

用于捕获当前位置、暂停和更改按钮文本以单击以恢复的代码

int media_length = mediaplayer.getCurrentPosition();
    Toast.makeText(this,"media length is"+media_length, Toast.LENGTH_LONG).show();
    mbutton.setText("Click to Resume");
    mediaplayer.pause();

Code to seekTo captured position, start and change button text to Click to Pause

代码来寻找捕获的位置,开始并将按钮文本更改为单击以暂停

    mediaplayer.seekTo(media_length);
    mediaplayer.start();
    mbutton.setText("Click to Pause");

A couple of posts are there already related to it but they seem to claim a bug in Android. Ref: MediaPlayer seekTo doesn't workand is there any workaround for this? appreciate any help.

已经有几个帖子与之相关,但他们似乎声称 Android 中存在错误。参考:MediaPlayer seekTo 不起作用,是否有任何解决方法?感谢任何帮助。

采纳答案by Sanket

You can try below code. It is working for me...

你可以试试下面的代码。它对我有用...

public void forwardSong() {
    if (mPlayer != null) {
        int currentPosition = mPlayer.getCurrentPosition();
        if (currentPosition + seekForwardTime <= mPlayer.getDuration()) {
            mPlayer.seekTo(currentPosition + seekForwardTime);
        } else {
            mPlayer.seekTo(mPlayer.getDuration());
        }
    }
}

You can pause mediaplayer before this and just call start method after this method.

您可以在此之前暂停媒体播放器,并在此方法之后调用 start 方法。

回答by Dany Pop

Try to use the callback MediaPlayer.OnSeekCompleteListener.

尝试使用回调 MediaPlayer.OnSeekCompleteListener。

Important : In this sample, i've added SystemClock.sleep(200)because onSeekComplete(MediaPlayer arg0)is called too soon by the player BEFORE seekTo is really completed.

重要提示:在此示例中,我添加了SystemClock.sleep(200)因为onSeekComplete(MediaPlayer arg0)在seekTo 真正完成之前玩家太快地调用了它。

 mMediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(MediaPlayer arg0) {
            Log.d(TAG, "onSeekComplete() current pos : " + arg0.getCurrentPosition());
            SystemClock.sleep(200);
            mMediaPlayer.start();
        }
    });
    try {
        mMediaPlayer.seekTo(mCurrentPos);
    } catch (IllegalStateException e){
        Log.d(TAG, e.getLocalizedMessage(), e);
    }

回答by Developer Reyaz

Try this , it works

试试这个,它有效

   videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
            mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
                @Override
                public void onSeekComplete(MediaPlayer mp) {
                    mp.start();
                }
            });

        }
    });