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?
- MediaPlayer / VideoView - Stream de una URL y luego guardar el video después de la caché?
- Visibilidad del botón en VideoView después de usar videoView.setZOrderOnTop (true); Androide
- El video se reproduce en parte de la pantalla después de desbloquear la pantalla
- Android VideoView no se reproduce Orientación de retrato
- Hacer una pantalla completa en sólo la disposición-tierra de Android cuando se reproduce videoView
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(); } }
- Android Video no se ajusta a la anchura en el retrato de la videovista y no ocupa la pantalla completa en el paisaje
- Android - MediaController de VideoView dentro de diálogo aparece detrás del diálogo
- Android 4.1 - RTSP con VideoView y MediaController
- Cómo hacer que una videoview NO se inicie automáticamente después de preparado
- VideoView onResume pierde la parte del video almacenada en búfer
- Mediacontroller no funciona en la pestaña nexus 7
- Android VideoView pantalla completa con controles de barra de navegación superpuestos
- Problemas para conseguir que el video se reproduzca en Recyclerview
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.
- Cómo configurar una pestaña específica al abrir una actividad de Layout de pestaña deslizante?
- Rango de la señalStrength en dbm para dispositivos CDMA