Videoview暂停和恢复

时间:2011-09-02 21:43:37

标签: android lifecycle android-videoview

我是Android开发新手,我正在编写游戏。我的游戏在每个级别开始之前都有过程,并且通过视频查看完成过程。我的问题是,在应用程序暂停时,cutceen在恢复时从头开始。

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

我们的问题是视频实际上并没有从我们暂停的地方恢复,而是从一开始就恢复。

7 个答案:

答案 0 :(得分:53)

您可以使用此

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

original post

答案 1 :(得分:21)

不应使用video.pause(),video.resume(),因为当你调用它时,缓冲数据将会丢失。这也是为什么每当你调用video.resume()时VideoView在BEGINNING播放的原因。 看见: VideoView onResume loses buffered portion of the video

解决方案:

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

答案 2 :(得分:17)

而不是resume(),再次使用start() 它将从您暂停视频的位置开始播放。

答案 3 :(得分:12)

在OnPause中,您可以获得当前位置。

length=mVideoView.getCurrentPosition();

和长度值在OnResume()中使用。

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

工作正常。

答案 4 :(得分:1)

    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();
        }
    }

答案 5 :(得分:0)

请尝试以下代码,它将完全正常

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

答案 6 :(得分:0)

只需使用onSaveInstanseState方法而不是onPause,并使用onRestart而不是onResume。它肯定会奏效。干杯!