私はAndroid開発を始め、ゲームをプログラミングしています。私のゲームには、各レベルが始まる前にプレイするカットシーンがあり、ビデオビューを通じて行われます。再開すると、カットスクリーンは最初から再び開始されます。
@Override
public void onPause() {
super.onPause();
video.pause();
}
@Override
public void onResume()
{
super.onResume();
video.resume();
}
私たちの問題は、ビデオが実際に一時停止した場所からではなく、最初から再開することです。
これを使用できます
@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
}
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
}
フラグメントの場合は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>
OnPauseの代わりにonSaveInstanseStateメソッドを使用し、onResumeの代わりにonRestartを使用するだけです。それは間違いなく動作します。乾杯!