继续从onResume播放VideoView

hee*_*ero 17 android android-videoview

我有一个VideoView,当我启动电子邮件意图时,它会暂停.电子邮件意图完成后,我希望videoView继续播放,但是,它从头开始重新启动.

@Override
public void onPause() {
    Log.d(TAG, "onPause called");
    super.onPause();
    videoView.pause();
}
@Override
public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume called");
    videoView.start();//resume() doesnt work
}
Run Code Online (Sandbox Code Playgroud)

如何让videoView从停止的位置恢复.

iTu*_*rki 31

那这个呢:

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

// This gets called before onPause so pause video here.
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    stopPosition = videoView.getCurrentPosition(); 
    videoView.pause();
    outState.putInt("position", stopPosition);
}   
Run Code Online (Sandbox Code Playgroud)

然后在你的onCreate()中调用bundle中的stopPosition并全局设置它

@Override
protected void onCreate(Bundle args) {
    super.onCreate(args);
    if( args != null ) {
        stopPosition = args.getInt("position");
    }
Run Code Online (Sandbox Code Playgroud)


Abh*_*k V 14

seekTo在恢复视频时使用会产生轻微的闪烁效果.更好的方法是使用类pause()start()方法MediaPlayer而不是使用方法VideoView.该start()方法VideoView重新启动从一开始视频,但start()方法MediaPlayer如果视频简历pause()的方法已被以前称作.

这是官方的android doc说的

public void start()

在API级别1中添加开始或恢复播放.如果先前已暂停播放,则播放将从暂停的位置继续播放.如果播放已停止或之前从未开始播放,则播放将从头开始播放.

你可以得到MediaPlayer一个相关VideoViewOnPreparedListenerVideoView.

public class MainActivity extends Activity {

    private MediaPlayer mMediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        VideoView videoView = (VideoView) findViewById(R.id.videoView1);
        videoView.setVideoPath(path);
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                mMediaPlayer = mp;

            }
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

然后可以在对象本身上调用后续pause()resume()方法MediaPlayer.

//To pause the video
 mMediaPlayer.pause();

//To resume the video
mMediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)

非常简单而有效的解决方案 希望能帮助到你!

  • @NicolasJafelle VideoView`recovery`方法似乎不起作用.它从头开始播放视频.可能是`VideoView`的一些错误.`suspend()`是从内存中释放视频.在内部它执行`MediaPlayer`` relese()`. (3认同)
  • 在我的应用程序中,它为调用mMediaPlayer.start()提供了illegalStateException; 在简历上 (3认同)