web-dev-qa-db-ja.com

onResumeからVideoViewの再生を再開します

VideoViewがあり、Eメールインテントを開始すると一時停止します。メールインテントが完了したら、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
}

中断したところからvideoViewを再開するにはどうすればよいですか。

18
heero

これはどうですか:

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

次に、onCreate()で、バンドルからstopPositionを呼び出し、グローバルに設定します

@Override
protected void onCreate(Bundle args) {
    super.onCreate(args);
    if( args != null ) {
        stopPosition = args.getInt("position");
    }
31
iTurki

seekToを使用すると、ビデオの再開中にわずかにちらつきが発生します。より良いアプローチは、MediaPlayerのメソッドを使用する代わりに、VideoViewクラスのpause()およびstart()メソッドを使用することです。 VideoViewstart()メソッドはビデオを最初から再開しますが、start()メソッドがあった場合、MediaPlayerpause()メソッドはビデオを再開します。以前に呼ばれていました。

これが公式のAndroid docによると

public void start()

APIレベル1で追加再生を開始または再開します。以前に再生が一時停止されていた場合、再生は一時停止された場所から続行されます。再生が停止された場合、または以前に開始されたことがない場合、再生は最初から開始されます。

MediaPlayerVideoViewにあるOnPreparedListenerに関連付けられたVideoViewを取得できます。

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;

            }
        });
    }

}

次に、後続のpause()およびresume()メソッドをMediaPlayerオブジェクト自体で呼び出すことができます。

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

//To resume the video
mMediaPlayer.start();

非常にシンプルでありながら効率的なソリューション。それが役に立てば幸い!

15
Abhishek V