2012-08-14 16 views
13

Ho una visualizzazione video ed è una pausa quando avvio un messaggio di posta elettronica. Al termine dell'intenzione dell'email, desidero continuare la riproduzione di videoView, tuttavia, viene riavviato dall'inizio.Ripresa riproduzione di VideoView da onResume

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

Come posso ottenere il VideoView per riprendere da dove era stato interrotto.

risposta

28

Che dire di questo:

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

Poi, nel tuo onCreate() chiamano la stopPosition dal fascio e impostarlo a livello globale

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

è possibile memorizzare il tuo 'stopPosition' nel outState durante onSaveInstanceState (Bundle outState), che puoi raccogliere nelle tue attività utilizzando onCreate (Bundle savedInstanceState). – Entreco

11

Utilizzando seekTo dà un leggero efeect sfarfallio mentre riprendere il video. Un approccio migliore sarebbe utilizzare i metodi pause() e start() della classe MediaPlayer invece di utilizzare i metodi da VideoView. Il metodo start() di VideoView riavvia il video dall'inizio, ma il metodo start() di MediaPlayer riprende il video se in precedenza era stato chiamato il metodo pause().

Ecco cosa doc ufficiale di Android dice

pubblico void start()

Aggiunto a livello di API 1 Avvia o riprende la riproduzione. Se la riproduzione era stata sospesa in precedenza, , la riproduzione continuerà da dove era in pausa. Se la riproduzione è stata interrotta o non è mai stata avviata prima, la riproduzione dello inizierà all'inizio.

è possibile ottenere il MediaPlayer associata ad un VideoView in OnPreparedListener di 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; 

      } 
     }); 
    } 

} 

Poi successive pause() e resume() metodi possono essere chiamati MediaPlayer oggetto stesso.

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

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

Soluzione molto semplice ma efficiente. Spero che sia d'aiuto!

+0

Ottima risposta! Ma ... mi chiedo perché i metodi suspend() e resume() ?? Se pausa/inizio esegui il trucco. –

+3

@NicolasJafelle Il metodo 'resume' di VideoView non sembra funzionare. Inizia il video dall'inizio. Può esserci un bug con il 'VideoView'. E 'suspend()' è quello di rilasciare il video dalla memoria. Internamente esegue 'MediaPlayer'' relese() '. –

+1

Nella mia app fornisce illegalStateException per la chiamata mMediaPlayer.start(); nel curriculum vitae – beginner

Problemi correlati