У меня есть приложение с VideoView, которое будет повторять одно и то же видео снова и снова, пока пользователь не сделает что-то с устройством (сенсорный экран и т. Д.). В настоящее время я использую OnCompletionListener () для перезапуска видео после его завершения.Это работает правильно на всех устройствах, которые я тестировал, кроме Samsung Replenish.
Вот мой код:
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mVideoView.setVideoPath(file.getAbsolutePath());
mVideoView.start();
}
});
Что происходит на Replenish, так это то, что видео воспроизводится до конца один разно затем никогда не запускается снова, и экран становится все черным (но подсветка по-прежнему включена).На любом другом устройстве, которое я тестировал с таким же кодом, он работал, чтобы повторить видео.Кто-нибудь знает что-нибудь конкретное о Replenish, которое может вызвать эту ошибку?Я подумал, что, возможно, может помочь отсрочка вызовов setVideoPath () и start () на 200-300 мс, но это никак не отразилось.Я действительно в растерянности.
Я вижу эти сообщения в моем журнале:
ERROR / QCvdec (87): Omx Flush выдается, когда vdec еще не инициализирован.
ERROR / QCvdec (87): OMXCORE-SM: полученная команда DISABLE (2)
ERROR / QCvdec (87): Omx Flush выдается, когда vdec еще не инициализирован.
ERROR / QCvdec (87): OMXCORE-SM: полученная команда ENABLE (3)
Но эти журналы происходят как при запуске видео (при первом воспроизведении), так и при сбое запускаснова.поэтому я не уверен, связаны ли они с моей проблемой
Редактировать:
Я просто попытался установить для mVideoView значение null, а затем получить новую ссылку на него с помощью findViewById () прямо перед setVideoPath().Я знаю, что это усложнит способ настройки OnCompletionListener.Но несмотря на это он все равно не работал, все тот же темный экран.
Редактировать 2:
Я начал замечать, что иногда видео даже не запускается в первый раз,Я использую эти две строчки, чтобы запустить его в первый раз:
mVideoView.setVideoPath(file.getAbsolutePath());
mVideoView.start();
Кажется, что он запускается более последовательно, но не совсем на 100%, когда проигрывается в первый раз.
Редактировать 3: Вот как я сейчас это настроил.Я вручную настраиваю OnPreparedListener, чтобы запустить видео для меня.Поэтому я добавил это в свой onCreate ()
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
mVideoView.start();
}
});
Затем, когда я готов перезапустить видео, я просто вызываю только метод setVideoPath (), например:
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mVideoView.setVideoPath(file.getAbsolutePath());
}
});
Thisкажется, делает трюк.Я позволяю ему какое-то время работать, чтобы выяснить наверняка.
Редактировать 4:
@ MByD В коде для VideoView setVideoPath () является оболочкой для setVideoUri ().setVideoURI () устанавливает mStartWhenPrepared = false;
По умолчанию OnPreparedListener проверяет этот переключатель, чтобы решить, следует ли начать воспроизведение или нет.Вот почему он не начинается со слушателя по умолчанию.Я не стал вдаваться в подробности, но может быть метод setter, который позволяет мне изменить значение mStartWhenPrepared на true, что приведет к запуску видео из прослушивателя по умолчанию.