VideoView seekTo 0 вместо определенной позиции

Я пытаюсь запустить видео с определенной позиции, но VideoView ведет себя странно. Когда я запускаю такой код

videoView.seekTo(2000)
int current = videoView.getCurrentPosition()
Log.e("Current Time", String.valueOf(current))

Журнал дает мне значение 0. Он должен дать 2000, потому что это текущая позиция. Даже если я реализую onPreparedListener, это не сработает (но по-другому). Он отображает правильное значение (2000), но видео по-прежнему не ищет.

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp)
            {
                videoView.getDuration();
                videoView.seekTo(2000);
                Log.e("Current: ", String.valueOf(videoView.getCurrentPosition()));
            }
        });

Как с этим бороться? Если я соберу MediaPlayer + SurfaceView, это поможет или будет вести себя так же, как VideoView?


person KyluAce    schedule 27.04.2020    source источник
comment
Вы проверили, возможен ли вообще seekTo: developer.android.com/ ссылка/android/виджет/   -  person Christopher    schedule 27.04.2020
comment
Хм, обычный класс MediaPlayer предоставляет обратный вызов OnSeekCompleteListener, но похоже, что VideoView не предлагает обратные вызовы. Я думаю, что использование собственной реализации может быть лучшим решением. Или рассмотрим, например. с помощью Exoplayer?   -  person Christopher    schedule 27.04.2020
comment
@Christopher тебя можно поискать.   -  person KyluAce    schedule 27.04.2020


Ответы (1)


На самом деле дело в том, что VideoView.seekTo() является оболочкой для MediaPlayer.seekTo(). Эта функция возвращается почти сразу же, даже если фактический поиск все еще выполняется. Поэтому следует дождаться завершения поиска через MediaPlayer.OnSeekCompleteListener.

Однако стандартный VideoView не поддерживает OnSeekCompleteListener.

Но вы можете скопировать и локально настроить класс VideoView, чтобы добавить эту поддержку самостоятельно.

Или вы можете попробовать это

mVideoView.setOnPreparedListener(new MediaPlayer .OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {

    mp.setOnSeekCompleteListener(new OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(MediaPlayer mp) {


            Log.e("Current: ", String.valueOf(videoView.getCurrentPosition()));
        }
    });

}
});
videoView.seekTo(2000); //or wherever the call is to be made

Надеюсь, это должно помочь.

person Amit Gupta    schedule 27.04.2020
comment
Я читал это раньше :D в любом случае это не объясняет такое странное поведение. - person KyluAce; 27.04.2020
comment
Однако вы можете использовать OnSeekCompleteListener через объект медиаплеера. Я добавил этот код, надеюсь, он поможет. - person Amit Gupta; 27.04.2020
comment
попробую через минут - person KyluAce; 27.04.2020
comment
Код даже не вызывали. - person KyluAce; 27.04.2020
comment
Какая именно у вас была проблема? Не могли бы вы уточнить? Дело в том, что вам нужно вызвать OnSeekCompleteListener изнутри вашего OnPreparedListener, поскольку в видеопросмотре нет SeekCompleteListener. - person Amit Gupta; 27.04.2020
comment
Прежде всего, нам нужно вызвать videoView.seekTo перед onPreparedListener, если нужно вызвать OnSeekComplete. Если мы это сделаем, этот журнал даст нам правильное значение (2000), но дело в том, что видео все равно начнется с самого начала. - person KyluAce; 28.04.2020