我是 Android 开发新手,正在编写游戏。我的游戏有在每个关卡开始之前播放的过场动画,这些过场动画是通过视频视图完成的。我的问题是,应用程序暂停后,过场动画在恢复时会再次从头开始。
@Override
public void onPause() {
super.onPause();
video.pause();
}
@Override
public void onResume()
{
super.onResume();
video.resume();
}
我们的问题是,视频实际上并没有从我们暂停的地方恢复,而是从头开始。
您可以使用
VideoView.getCurrentPosition()
存储当前位置,并使用 VideoView.seekTo()
返回该点。这样您就不需要 VideoView
来保持其状态。
重要的是使用正确的侦听器,仅在查找操作完成后才跟进
VideoView.start()
。
@Override
public void onPause() {
// store position if it needs to survive configuration changes
int position = videoView.getCurrentPosition();
videoView.pause();
super.onPause();
}
@Override
public void onResume() {
super.onResume();
// use prepared listener to start seeking once video is loaded
videoView.setOnPreparedListener(mp -> {
mp.seekTo(position);
// use on seek complete listener to resume playback
mp.setOnSeekCompleteListener(smp -> smp.start());
});
}
不应该使用video.pause()、video.resume(),因为当你调用它们时,缓冲数据将会丢失。这也是每当您调用 video.resume() 时 VideoView 在 BEGINNING 播放的原因。 看见: 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
}
}
再次使用
resume()
,而不是 start()
。在OnPause中你可以获取当前位置。
length=mVideoView.getCurrentPosition();
以及OnResume()中使用的长度值。
mVideoView.seekTo(length);
mVideoView.start()
工作正常。
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 doesn't work. I'm not sure
}
在 Fragment 的情况下 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();
}
}
请尝试下面的代码,它绝对可以正常工作
@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>
只需使用 onSaveInstanseState 方法代替 onPause,并使用 onRestart 代替 onResume。它肯定会起作用。干杯!