Android VideoView borrar la visualización después de stopPlayback ()

Estoy utilizando un componente de VideoView para reproducir videos. Parece que no puedo borrar la pantalla de VideoView después de invocar manualmente stopPlayback (). Me gustaría restablecer el VideoView para que el fondo original sea visible.

  1. Reproduce un video en un componente VideoView.
  2. Seleccione un video nuevo para reproducirlo.
  3. El VideoView está atascado en el último fotograma del primer video hasta que comience el siguiente video. Si hay un error con el siguiente video, la imagen estática del primer video permanece atascada allí.
  4. Si dejo que el video se reproduzca hasta el estado de finalización, la pantalla se borra.

El código que estoy usando:

private VideoView videoViewer = null; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... if (videoViewer != null) { videoViewer.setOnPreparedListener(new OnPreparedListener()); } ... } public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (videoViewer != null) { videoViewer.stopPlayback(); videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); } } private class OnPreparedListener implements MediaPlayer.OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { videoViewer.start(); } } 

Tenga en cuenta que basándose en el origen VideoView.java, stopPlayback () realiza la siguiente acción en el MediaPlayer subyacente:

 public void stopPlayback() { if (mMediaPlayer != null) { mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } } 

Para mí, lo que funcionó fue simplemente ocultar luego mostrar el VideoView usando setVisibility .

 public void clearCurrentFrame() { videoView.setVisibility(GONE); videoView.setVisibility(VISIBLE); } 

Esto era porque quería que el VideoView volviera transparente, no un color sólido. El ajuste del fondo a transparente no funciona – el marco de vídeo sigue apareciendo.

La solución en la que me establecí, a menos que alguien pueda ofrecer una mejor, es usar setBackgroundResource , que parece extrañamente nombrado, ya que parece cambiar el recurso de primer plano.

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... videoViewer.setBackgroundResource(R.drawable.viewer_background); ... } public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (videoViewer != null) { videoViewer.stopPlayback(); // Set the background back to the drawable resource to clear the current video when switching to a new one. videoViewer.setBackgroundResource(R.drawable.viewer_background); videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); } } private class OnPreparedListener implements MediaPlayer.OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { videoViewer.start(); // Clear the background resource when the video is prepared to play. videoViewer.setBackgroundResource(0); } } 

El drawable que estoy referenciando es una layer-list simple de la layer-list con un fondo azul de encargo y una imagen centrada de la insignia.

Drawable \ viewer_background.xml:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <solid android:color="@color/custom_blue" /> </shape> </item> <item> <bitmap android:src="@drawable/img_logo" android:gravity="center" /> </item> </layer-list> 

Alternativamente también pude usar setZOrderOnTop para controlar dónde se coloca la vista de la superficie (también se podría definir otra vista encima del VideoViewer y cambiar la visibilidad de esa manera):

 videoViewer.setZOrderOnTop(false); videoViewer.setZOrderOnTop(true); 

Alternativamente también podría usar setBackgoundColor para lograr lo mismo que setBackgroundResource :

 videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue)); videoViewer.setBackgroundColor(Color.TRANSPARENT); 

Bueno, para mí ninguna de las soluciones de este hilo funcionó, así que probé algo más y por debajo es la solución que funcionó para mí,

 new Handler().postDelayed(new Runnable() { @Override public void run() { mVideoViewPlayList.setVisibility(View.GONE); mVideoViewPlayList.setVisibility(View.VISIBLE); mVideoViewPlayList.setVideoURI(Uri.parse(path)); } }, 500); 

Sólo este código:

 videoView.setVideoURI(null); 
  • ¿Acceso estático a los recursos de una aplicación para Android?
  • Android Studio: EditText editable es obsoleto Cómo utilizar inputType
  • Cómo capturar los cambios de tamaño de widget en dispositivos donde onAppWidgetOptionsChanged no se llama?
  • Comportamiento extraño de drawableRight para Switch
  • Android NumberPicker no guardar los cambios de EditText
  • ¿Cómo puedo antialias el límite del clip en el lienzo de Android?
  • Aplicar un tema a un appwidget
  • Obtener dirección usando Geocoder en android
  • Cardview - Establece diferentes colores de fondo para cada elemento
  • Poner muro de facebook en Android
  • Cómo hacer widget de la aplicación en ejecución en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.