2012-08-14 13 views
13

Tengo una VideoView y se pausa cuando comienzo un intento de Email. Cuando finalice la intención del correo electrónico, quiero que la videoView continúe reproduciéndose, sin embargo, se reinicia desde el principio.Reanudar reproducción de VideoView desde 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 
} 

¿Cómo puedo obtener la videoView para reanudar desde donde se quedó.

Respuesta

28

Qué tal esto:

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

Luego, en su onCreate() llaman a la stopPosition desde el haz y la pusieron a nivel mundial

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

puede almacenar su 'stopPosition' en el outState durante onSaveInstanceState (Bundle outState), que puede recogerlo en sus actividades usando onCreate (Bundle savedInstanceState). – Entreco

11

Usando seekTo da un ligero efeect parpadeo mientras reanudar el video. Un mejor enfoque sería usar los métodos pause() y start() de la clase MediaPlayer en lugar de utilizar los métodos del VideoView. El método start() de VideoView reinicia el video desde el principio, pero el método start() de MediaPlayer reanuda el video si el método pause() se había llamado previamente.

Esto es lo que dice el doc androide oficial

pública void start()

añadido en el nivel API 1 Inicia o reanuda la reproducción. Si la reproducción tenía previamente en pausa, la reproducción continuará desde donde estaba en pausa. Si la reproducción se detuvo o nunca se inició antes, la reproducción de comenzará desde el principio.

que pueda obtener el MediaPlayer asociado con un VideoView en OnPreparedListener de 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; 

      } 
     }); 
    } 

} 

Entonces posteriores pause() y resume() métodos pueden ser llamados en MediaPlayer objeto mismo.

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

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

Solución muy simple pero eficiente. ¡Espero eso ayude!

+0

¡Excelente respuesta! Pero ... me pregunto por qué los métodos suspend() y resume() ?? Si pause/start hace el truco. –

+3

@NicolasJafelle El método VideoView 'resume' no parece funcionar. Comienza el video desde el principio. Puede haber algún error con 'VideoView'. Y 'suspend()' es para liberar el video de la memoria. Internamente, ejecuta 'MediaPlayer'' relese() '. –

+1

En mi aplicación, da illegalStateException para la llamada mMediaPlayer.start(); en el currículum on-line – beginner

Cuestiones relacionadas