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?
- Streaming de vídeos de Youtube
- VideoView y Progressive descargar
- Android Video View no reproduce archivos MP4 en algunos dispositivos
- Error de MediaPlayer / VideoView de Android (1, -2147483648)
- VideoView en Viewpager, detener el vídeo al cambiar de página
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 View en otro hilo y problema con android 2.1
- Error de MediaPlayer de Android (1, -2147483648)
- Obtener el camino real para Uri Android
- Mostrando la imagen de Gif animado en android usando VideoView
- Webview de Android: vídeo en el área de pantalla personalizada como una superposición para el streaming de vídeo en vivo de rtsp
- Android VideoView setVideoURI bloquea el subproceso de la interfaz de usuario
- ¿Deshabilitar la solicitud de VideoView de AndroidAudioFocus al reproducir un video?
- Juega RTP stream withouth RTSP en Android VideoView
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