2012-08-14 13 views
13

私はVideoViewを持っています。私はEmailインテントを開始すると一時停止します。電子メールのインテントが完了すると、私はvideoViewの再生を続けますが、最初から再開します。onResumeから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 
} 

ビデオビューを中止した場所から再開するにはどうすればよいですか?

答えて

28

これについて何:ビデオを再開しながら、

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

seekToを使用した後、あなたのonCreate()内のバンドルから停止位置を呼び出して、グローバル

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

onSaveInstanceState(Bundle outState)の間にoutStateに 'stopPosition'を格納できます。これは、onCreate(Bundle savedInstanceState)を使用してアクティビティで取り込むことができます。 – Entreco

11

それを設定すると、わずかなちらつきefeectを与えます。より良いアプローチはVideoViewのメソッドを使用する代わりにMediaPlayerクラスのpause()start()メソッドを使用することです。 start()メソッドがVideoViewの場合は、最初からビデオが再開されますが、MediaPlayerのメソッドstart()は、以前にpause()メソッドが呼び出された場合にビデオを再開します。ここで

は公式Androidのドキュメントが

はAPIレベル1開始で追加または再生を再開します)(

ます。public void startを言うことです。 の再生が以前に一時停止されていた場合は、再生が一時的に中止されたところから再生されます。 再生が停止した場合、または以前に再生が開始されていない場合は、最初に の再生が開始されます。

あなたはMediaPlayerVideoViewOnPreparedListenerVideoViewに関連付けられ得ることができます。

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

非常に簡単で効率的なソリューションです。それが役に立てば幸い!

+0

優秀な回答!しかし、私はなぜsuspend()メソッドとresume()メソッドが不思議に思っていますか?一時停止/開始がトリックを行う場合。 –

+3

@NicolasJafelle VideoView 'resume'メソッドが動作していないようです。最初からビデオを開始します。 'VideoView'のバグかもしれません。そして 'suspend()'はメモリからビデオを解放することです。内部的に 'MediaPlayer'' relese()を実行します。 –

+1

私のアプリでは、mMediaPlayer.start()コールでillegalStateExceptionが返されます。 on the resume – beginner

関連する問題