简体   繁体   English

Android MediaPlayer SeekTo功能解决方法

[英]Android MediaPlayer SeekTo function workaround

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. 我想从使用getCurrentPosition捕获的SeekTo位置恢复这首歌。 However seekTo does not start from the position I have captured but from the beginning. 但是,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. 有几个帖子已经与它有关,但它们似乎在Android中声称存在错误。 Ref: MediaPlayer seekTo doesn't work and is there any workaround for this? 参考: MediaPlayer seekTo不起作用 ,是否有任何解决方法? appreciate any help. 感谢任何帮助。

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. 您可以在此之前暂停mediaplayer,并在此方法之后调用start方法。

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)

 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);
    }

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();
                }
            });

        }
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM