Eventos VideoView onTouch: pausar / reanudar vídeo y mostrar / ocultar MediaController y ActionBar

Resumen de la pregunta:

1) ¿Cómo mostrar primero el video en pausa, y no reproducirlo inmediatamente?

2) Cómo pausar / deshabilitar el video al tocar, y también ocultar / mostrar el ActionBar y MediaController.

Apreciaría cualquier consejo. ¡Gracias! (Se adjunta el Código pertinente)

Actualización 1

Encontrado algo de una solución a la pregunta 2 (necesario para volver falso), pero todavía no sé cómo responder a la pregunta 1.

Cuando el usuario presiona un botón en mi aplicación, los lleva a ver su video. Cuando abra la pantalla por primera vez, me gustaría que el video se detenga y no se reproduzca inmediatamente. También me gustaría poder pausar la reproducción del video tocando la pantalla. Cuando el video está en pausa, me gustaría mostrar el ActionBar y el MediaController . Cuando se reanude el video, me gustaría ocultar el ActionBar y MediaController (posiblemente después de un ligero retraso?)

He intentado algunas cosas, pero termino con problemas, como el video se detendrá pero no se reanudará, o el ActionBar y MediaController no mostrará ni ocultará correctamente.

Actualización 2

He encontrado una solución parcial a la pregunta 1 y he actualizado el código para mostrar el video como pausado la primera vez que se abre. Sin embargo, cuando se abre por primera vez, sólo muestra una pantalla en negro hasta que toco el videoview para reproducirlo. Después de ver el video una vez, se restablecerá al principio y pausará, esperando para ser reproducido de nuevo, y mostrará la imagen correcta desde el principio del video. Pero no sé cómo conseguir alrededor de la pantalla negra al principio.

Código relevante:

 public class ViewImageVideoFragment extends Fragment { private int position = 0; private MediaController mMediaController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mMediaController = new MediaController(getActivity()); ... } @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { if (savedInstanceState != null) { position = savedInstanceState.getInt("position"); } View v = inflater.inflate(R.layout.fragment_video_view, parent, false); mVideoView = (VideoView) v.findViewById(R.id.fragmentVideoView); mVideoView.setVideoPath(videoPath); mVideoView.setMediaController(mMediaController); mVideoView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent motionEvent) { if (mVideoView.isPlaying()) { mVideoView.pause(); if (!getActivity().getActionBar().isShowing()) { getActivity().getActionBar().show(); mMediaController.show(0); } position = mVideoView.getCurrentPosition(); return false; } else { if (getActivity().getActionBar().isShowing()) { getActivity().getActionBar().hide(); mMediaController.hide(); } mVideoView.seekTo(position); mVideoView.start(); return false; } } }); mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { mVideoView.seekTo(0); } }); if (position != 0) { mVideoView.seekTo(position); mVideoView.start(); } else { mVideoView.seekTo(0); } } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); if (mVideoView != null) { savedInstanceState.putInt("position", mVideoView.getCurrentPosition()); } mVideoView.pause(); } } 

Para mostrar primero el vídeo en pausa, simplemente cambie seekTo(0) a seekTo(1) en su código. Esto moverá el vídeo a la hora en 1 milisegundo y usted puede tomarlo de allí.

 //edited here private int position = 1; private MediaController mMediaController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mMediaController = new MediaController(getActivity()); ... } @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { if (savedInstanceState != null) { position = savedInstanceState.getInt("position"); } View v = inflater.inflate(R.layout.fragment_video_view, parent, false); mVideoView = (VideoView) v.findViewById(R.id.fragmentVideoView); mVideoView.setVideoPath(videoPath); mVideoView.setMediaController(mMediaController); mVideoView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent motionEvent) { if (mVideoView.isPlaying()) { mVideoView.pause(); if (!getActivity().getActionBar().isShowing()) { getActivity().getActionBar().show(); mMediaController.show(0); } position = mVideoView.getCurrentPosition(); return false; } else { if (getActivity().getActionBar().isShowing()) { getActivity().getActionBar().hide(); mMediaController.hide(); } mVideoView.seekTo(position); mVideoView.start(); return false; } } }); mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { //here mVideoView.seekTo(1); } }); //here if (position != 1) { mVideoView.seekTo(position); mVideoView.start(); } else { //here mVideoView.seekTo(1); } } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); if (mVideoView != null) { savedInstanceState.putInt("position", mVideoView.getCurrentPosition()); } mVideoView.pause(); } 

}

Si entiendo correctamente, desea mostrar un marco del vídeo como un marcador de posición hasta que esté listo para iniciar el vídeo. Hay dos maneras que sé para lograr esto:

tratar de

Puede utilizar MediaPlayer.seekTo para mover el vídeo algunos fotogramas por delante, por ejemplo, usando el valor 150 para mostrar el fotograma en el 150º milisegundo en el archivo de vídeo. El video no necesita ser iniciado para buscar.

MediaMetadataRetriever

 MediaMetadataRetriever met = new MediaMetadataRetriever(); try { met.setDataSource(data[0], new HashMap<String, String>()); //use this constructor, other one has a bug... Bitmap b = met.getFrameAtTime(); if (b == null) b = met.getFrameAtTime(150, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); met.release(); return b; } catch (Exception e) { Log.d(TAG, "MediaMetadata failed", e); } 

Esto le dará un Bitmap que puede luego lanzar un ImageView y establecer en lugar del video. Sin embargo, esta API siempre ha sido buggy para mí, dependiendo de los tipos de códecs de vídeo que se trata.

Mis fuentes –

espectáculo()
Show (int timeout)
esconder()
está mostrando()
OnTouchEvent ()

Todas las notas están en el código

 public class ViewImageVideoFragment extends Fragment { private int position = 0; private MediaController mMediaController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mMediaController = new MediaController(getActivity()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { if (savedInstanceState != null) { position = savedInstanceState.getInt("position"); } v = inflater.inflate(R.layout.fragment_video_view, parent, false); mVideoView = (VideoView) v.findViewById(R.id.fragmentVideoView); mVideoView.setVideoPath(videoPath); mVideoView.setMediaController(mMediaController); mVideoView.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent motionEvent) { if (mVideoView.isPlaying()) { mVideoView.pause(); /* Ok, so now you want to use that show(), preferrably without the int timeout I didn't add it in myself but you should be able to handle it yourself */ return true; } else /* I changed it to else, change it to if else if you have something specific you want to deal with */ { /* I would use that hide method I linked here, then start the video, I assume you know how to play the video yourself */ } return false; } }); mVideoView.seekTo(position); mVideoView.start(); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); if (mVideoView != null) { savedInstanceState.putInt("position", mVideoView.getCurrentPosition()); } mVideoView.pause(); } } 

Proveí los otros métodos porque, dependiendo de cómo puede continuar, pueden o no prevenir preguntas futuras.

  • El botón de retroceso de Android no funciona mientras se reproduce vídeo en VideoView
  • Android obtiene la ruta de origen de vídeo de VideoView
  • Cómo hacer que una videoview NO se inicie automáticamente después de preparado
  • ¿Hay una manera de hacer que VideoView siga jugando en segundo plano en la aplicación para Android?
  • Android VideoView no se reproduce Orientación de retrato
  • Android VideoView error (1,16) y muestra la pantalla en negro
  • Android Reproducir vídeo por intención
  • Añadir vista en la parte superior de MediaController
  • Android: carga el video desde la carpeta privada de la aplicación
  • Detectar si un VideoVIew está almacenando en búfer
  • Android VideoView pantalla completa con controles de barra de navegación superpuestos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.