Videoview Приостановка и возобновление
Я новичок в разработке Android, и я программирую игру. В моей игре есть cutsceens, которые играют до начала каждого уровня, cutsceens, которые выполняются через видео. Моя проблема заключается в том, что при паузе приложения резак начинается с начала снова, когда возобновляется.
@Override
public void onPause() {
super.onPause();
video.pause();
}
@Override
public void onResume()
{
super.onResume();
video.resume();
}
Наша проблема заключается в том, что видео не возобновляется с того места, где мы приостановили его, но с самого начала.
Ответы
Ответ 1
Вы можете использовать этот
@Override
public void onPause() {
Log.d(TAG, "onPause called");
super.onPause();
stopPosition = videoView.getCurrentPosition(); //stopPosition is an int
videoView.pause();
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume called");
videoView.seekTo(stopPosition);
videoView.start(); //Or use resume() if it doesn't work. I'm not sure
}
оригинальное сообщение
Ответ 2
Не следует использовать video.pause(), video.resume(), потому что когда вы его вызываете, данные буферизации будут потеряны. Это также причина, по которой WHEW VideoView играет в BEGINNING, когда вы вызываете video.resume().
Видеть это:
VideoView onResume теряет буферную часть видео
Решение:
VideoView videoView;
MediaPlayer mp;
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
this.mp = mp;
}
});
public void pause(){
//NOT videoview.pause(); Needn't save Stop position
if (mp != null){
mp.pause();
}
}
public void resume(){
//NOT videoview.resume();
if (mp != null){
mp.start(); //Video will begin where it stopped
}
}
Ответ 3
Вместо resume()
снова используйте start()
.
Он начнет воспроизведение с того места, где вы приостановили видео.
Ответ 4
В OnPause вы можете получить текущую позицию.
length=mVideoView.getCurrentPosition();
и значение длины в OnResume().
mVideoView.seekTo(length);
mVideoView.start()
работает нормально.
Ответ 5
int stopPosition; // Globally declare class level...
@Override
public void onPause() {
super.onPause();
onPauseVideoView();
}
@Override
public void onResume() {
super.onResume();
Log.e("WatchVideoAd Fragment", "onPause called");
onResumeVideoView();
}
private void onPauseVideoView() {
stopPosition = videoview.getCurrentPosition(); //stopPosition is an int
videoview.pause();
}
private void onResumeVideoView() {
videoview.seekTo(stopPosition);
videoview.start(); //Or use resume() if it does not work. I'm not sure
}
onHiddenChanged в случае фрагмента
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
if (getActivity() != null) {
((AppActivity) getActivity()).updateTitle(getResources().getString(R.string.title_game));
}
Log.e("keshav", "WatchVideoAd Fragment ");
onResumeVideoView();
} else {
Log.e("keshav", "WatchVideoAd Fragment else ");
onPauseVideoView();
}
}
Ответ 6
Попробуйте ниже код, который будет работать абсолютно нормально
@Override
public void onPause() {
super.onPause();
stopPosition = videoView.getCurrentPosition(); //stopPosition is an int
if (videoView.isPlaying())
videoView.pause();
}
@Override
public void onResume() {
super.onResume();
if (videoView != null) {
videoView.seekTo(stopPosition);
}
}
пожалуйста, убедитесь, что указанная ниже строка указана в вашем Manifest.xml
<activity
android:name="<Video Play Activity Name Here>"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="landscape"
></activity>
Ответ 7
Просто используйте метод onSaveInstanseState вместо onPause и используйте onRestart вместо onResume. Это определенно будет работать. Ура!