视频观看暂停和恢复

问题描述 投票:0回答:7

我是 Android 开发新手,正在编写游戏。我的游戏有在每个关卡开始之前播放的过场动画,这些过场动画是通过视频视图完成的。我的问题是,应用程序暂停后,过场动画在恢复时会再次从头开始。

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

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

android lifecycle android-videoview
7个回答
67
投票

您可以使用

VideoView.getCurrentPosition()
存储当前位置,并使用
VideoView.seekTo()
返回该点。这样您就不需要
VideoView
来保持其状态。

重要的是使用正确的侦听器,仅在查找操作完成后才跟进

VideoView.start()

Java代码

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

原帖


30
投票

不应该使用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
    }   
}

20
投票

再次使用

resume()
,而不是
start()

它将从您暂停视频的位置开始播放。


13
投票

在OnPause中你可以获取当前位置。

length=mVideoView.getCurrentPosition();

以及OnResume()中使用的长度值。

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

工作正常。


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
    }

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

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>

0
投票

只需使用 onSaveInstanseState 方法代替 onPause,并使用 onRestart 代替 onResume。它肯定会起作用。干杯!

© www.soinside.com 2019 - 2024. All rights reserved.