2012-08-14 60 views
13

我有一個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 
} 

如何讓videoView從停止的位置恢復。

回答

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

然後在您的onCreate()調用從包中stopPosition並設置它在全球

@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 2012-12-28 15:00:33

11

使用seekTo給出了一個輕微的閃爍efeect再次開始視頻。更好的方法是使用pause()start()方法MediaPlayer類而不是使用來自VideoView的方法。 VideoViewstart()方法從頭開始重新開始視頻,但start()方法MediaPlayer如果先前已調用pause()方法,則重新開始播放視頻。

下面是官方Android醫生說

公共無效的start()

在API級別1開始或繼續播放。如果先前已暫停播放 ,則播放將從暫停的 處繼續播放。如果播放已停止,或從未開始播放,則將從頭開始播放。

你可以得到一個VideoViewVideoViewOnPreparedListener相關的MediaPlayer

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()方法?如果暫停/開始做的伎倆。 – 2014-06-05 14:42:59

+3

@NicolasJafelle VideoView'resume'方法似乎沒有工作。它從一開始就開始播放視頻。可能是'VideoView'的一些錯誤。 'suspend()'是從內存中釋放視頻。它在內部執行'MediaPlayer''resese()'。 – 2014-06-05 15:06:36

+1

在我的應用程序中,它給出了調用mMediaPlayer.start()的illegalStateException;在恢復中 – beginner 2016-08-10 12:48:26