web-dev-qa-db-ja.com

ビデオビューの一時停止と再開

私はAndroid開発を始め、ゲームをプログラミングしています。私のゲームには、各レベルが始まる前にプレイするカットシーンがあり、ビデオビューを通じて行われます。再開すると、カットスクリーンは最初から再び開始されます。

    @Override
public void onPause() {
    super.onPause();
    video.pause();
}
@Override
public void onResume()
{
    super.onResume();
    video.resume();
}

私たちの問題は、ビデオが実際に一時停止した場所からではなく、最初から再開することです。

40
Athos

これを使用できます

@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
}

元の投稿

56
Sanket Patel

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
    }   
}
22
Khang .NT

resume()の代わりに、start()を再度使用します。
ビデオを一時停止したところから再生を開始します。

17
Flynn81

OnPauseでは、現在の位置を取得できます。

length=mVideoView.getCurrentPosition();

onResume()で使用される長さの値。

mVideoView.seekTo(length);
mVideoView.start()

正常に動作します。

13
    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();
        }
    }
1
Keshav Gera

以下のコードを試してください

 @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>
0
Anuj J Pandey

OnPauseの代わりにonSaveInstanseStateメソッドを使用し、onResumeの代わりにonRestartを使用するだけです。それは間違いなく動作します。乾杯!

0
user8324061