2011-08-10 13 views
5

Tengo una aplicación con VideoView que seguirá repitiendo el mismo video una y otra vez hasta que un usuario haga algo en el dispositivo (pantalla táctil, etc.) Actualmente estoy usando el OnCompletionListener() para reiniciar el video una vez que termina Esto funciona correctamente en todos los dispositivos que he probado, a excepción de Samsung Replenish.VideoView looping videos Replenish

Aquí está mi código:

mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     public void onCompletion(MediaPlayer mp) { 
      mVideoView.setVideoPath(file.getAbsolutePath()); 
      mVideoView.start(); 
     } 
    }); 

¿Qué ocurre en el Replenish es el vídeo se reproduce todo el camino a través de una vez, pero luego no se pone en marcha de nuevo y la pantalla se queda en todo negro (Pero retroiluminación sigue encendido). En todos los demás dispositivos en los que he probado con este mismo código, ha funcionado para repetir el video. ¿Alguien sabe de algo específico sobre el Reabastecimiento que podría causar este error? Pensé que quizás retrasar las llamadas a setVideoPath(), y start() por 200-300ms podría ayudarlo, pero eso no tuvo ningún efecto. Estoy realmente perdido aquí.

que estoy viendo estos mensajes en mi registro:

ERROR/QCvdec (87): OMX Flush emite cuando vdec no se ha iniciado todavía.

ERROR/QCvdec (87): OMXCORE-SM: Recibido comando DISABLE (2)

ERROR/QCvdec (87): OMX Flush emite cuando vdec no se ha iniciado todavía.

ERROR/QCvdec (87): OMXCORE-SM: comando Recieved HABILITAR (3)

Pero estos registros se están produciendo tanto en el momento que empiece el vídeo (la primera vez que juega) y cuando no se puede iniciar de nuevo. así que no estoy seguro de si están relacionados con mi problema

Editar:

he intentado establecer mVideoView a null, y luego conseguir una nueva referencia a ella con findViewById() justo antes de la setVideoPath(). Sé que esto complicaría la forma en que OnCompletionListener está configurado. Pero independientemente de eso, no funcionó de todos modos, sigue siendo la misma pantalla oscura.

Edición 2:

he empezado a notar que a veces el video ni siquiera comenzar la primera vez. Estoy usando estas mismas dos líneas para ponerlo en marcha por primera vez:

 mVideoView.setVideoPath(file.getAbsolutePath()); 
     mVideoView.start(); 

Parece que empezar más consistentemente, pero no es 100% cuando su se está jugando la primera vez.

Edición 3: Así es como lo tengo configurado ahora. Estoy configurando manualmente el OnPreparedListener para comenzar el video por mí. Así que he añadido esto a mi onCreate()

 mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer arg0) { 
       mVideoView.start(); 
      } 
     }); 

A continuación, cuando esté listo para reiniciar el video acabo de llamar sólo el método setVideoPath(), así:

mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    public void onCompletion(MediaPlayer mp) { 
     mVideoView.setVideoPath(file.getAbsolutePath()); 

    } 
}); 

Esto parece estar haciendo el truco. Sin embargo, lo dejo correr por un tiempo para averiguarlo.

Editar 4:

@MByD En el código para VideoView setVideoPath() es un contenedor para setVideoUri(). setVideoURI() está configurando mStartWhenPrepared = false; El OnPreparedListener predeterminado verifica este interruptor para decidir si se inicia la reproducción o no. Es por eso que no comienza con el oyente predeterminado. No he mirado en él más que eso, pero puede haber un método de selección que me permite cambiar el valor mStartWhenPrepared true, lo que provocaría que el vídeo se inicia desde la escucha predeterminado.

+0

pregunta interesante. – PedroAGSantos

Respuesta

3

¿Ha probado a lo prepare() el vídeo antes de llamar .start()?

de los documentos: http://developer.android.com/reference/android/media/MediaPlayer.html#prepare%28%29

con un OnPreparedListener puede iniciar su vídeo cuando está listo.

+0

No necesita llamar a prepararse cuando usa VideoView. – MByD

+0

prepare es un método para MediaPlayer, no VideoView. Supongo que VideoView llama a preparar en su MediaPlayer subyacente como parte del método setVideoPath(). Sin embargo, el oyente preparado podría ser lo que necesitaba. Lo estoy probando con eso ahora y parece estar mejorando. Obtendrás la respuesta correcta si todo va bien. Gracias – FoamyGuy