Comportamiento extraño – Fragmento de VideoViewer no funciona con MediaController
Estoy intentando crear un fragmento de VideoViewer. A continuación se presentan los 2 casos que he probado y las observaciones. Para ambos casos, la vista del fragmento se infla de la siguiente disposición:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <VideoView android:id="@+id/fragment_video_viewer_video" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" /> </RelativeLayout>
Caso 1: VideoView sin controlador de medios – funciona bien. A continuación se muestra el código para el método onActivityCreated
- ¿Cómo puedo reproducir video rtsp desde el servidor wowza?
- Tamaño máximo de vídeo se puede agregar en la carpeta sin procesar android compatible?
- Cambio de modo VideoView en línea / pantalla completa
- Android 3.1 / Galaxy Tab / VideoView no se reproducirá
- Mediacontroller no funciona en la pestaña nexus 7
/* Initialize the variables here, retrieve views and */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Assignment for the local variables mVideoView = (VideoView) getView().findViewById(R.id.fragment_video_viewer_video); mVideoView.setVideoPath("/sdcard/family_guy_test.3gp");//(videoUri); mVideoView.requestFocus(); mVideoView.start(); }
Caso 2: VideoView con controlador de medios – La aplicación se bloquea cuando toco el VideoView. A continuación se muestra el código para el método onActivityCreated
/* Initialize the variables here, retrieve views and */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Assignment for the local variables mVideoView = (VideoView) getView().findViewById(R.id.fragment_video_viewer_video); mVideoView.setVideoPath("/sdcard/family_guy_test.3gp");//(videoUri); MediaController mediaController = new MediaController(getActivity().getApplicationContext()); mediaController.setAnchorView(mVideoView); mVideoView.setMediaController(mediaController); mVideoView.requestFocus(); }
La salida logcat se da a continuación:
WARN/WindowManager(124): Failed looking up window WARN/WindowManager(124): java.lang.IllegalArgumentException: Requested window null does not exist WARN/WindowManager(124): at com.android.server.WindowManagerService.windowForClientLocked(WindowManagerService.java:9398) WARN/WindowManager(124): at com.android.server.WindowManagerService.addWindow(WindowManagerService.java:1906) WARN/WindowManager(124): at com.android.server.WindowManagerService$Session.add(WindowManagerService.java:6876) WARN/WindowManager(124): at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:66) WARN/WindowManager(124): at com.android.server.WindowManagerService$Session.onTransact(WindowManagerService.java:6848) WARN/WindowManager(124): at android.os.Binder.execTransact(Binder.java:288) WARN/WindowManager(124): at dalvik.system.NativeStart.run(Native Method) WARN/WindowManager(124): Attempted to add window with token that is not a window: null. Aborting. WARN/dalvikvm(8144): threadid=1: thread exiting with uncaught exception (group=0x400287f0) ERROR/AndroidRuntime(8144): FATAL EXCEPTION: main ERROR/AndroidRuntime(8144): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? ERROR/AndroidRuntime(8144): at android.view.ViewRoot.setView(ViewRoot.java:505) ERROR/AndroidRuntime(8144): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) ERROR/AndroidRuntime(8144): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) ERROR/AndroidRuntime(8144): at android.widget.MediaController.show(MediaController.java:304) ERROR/AndroidRuntime(8144): at android.widget.MediaController.show(MediaController.java:249) ERROR/AndroidRuntime(8144): at android.widget.VideoView.toggleMediaControlsVisiblity(VideoView.java:567) ERROR/AndroidRuntime(8144): at android.widget.VideoView.onTouchEvent(VideoView.java:518) ERROR/AndroidRuntime(8144): at android.view.View.dispatchTouchEvent(View.java:3766) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) ERROR/AndroidRuntime(8144): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) ERROR/AndroidRuntime(8144): at android.app.Activity.dispatchTouchEvent(Activity.java:2086) ERROR/AndroidRuntime(8144): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) ERROR/AndroidRuntime(8144): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) ERROR/AndroidRuntime(8144): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) ERROR/AndroidRuntime(8144): at android.app.Activity.dispatchTouchEvent(Activity.java:2086) ERROR/AndroidRuntime(8144): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) ERROR/AndroidRuntime(8144): at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) ERROR/AndroidRuntime(8144): at android.os.Handler.dispatchMessage(Handler.java:99) ERROR/AndroidRuntime(8144): at android.os.Looper.loop(Looper.java:123) ERROR/AndroidRuntime(8144): at android.app.ActivityThread.main(ActivityThread.java:4627) ERROR/AndroidRuntime(8144): at java.lang.reflect.Method.invokeNative(Native Method) ERROR/AndroidRuntime(8144): at java.lang.reflect.Method.invoke(Method.java:521) ERROR/AndroidRuntime(8144): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) ERROR/AndroidRuntime(8144): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) ERROR/AndroidRuntime(8144): at dalvik.system.NativeStart.main(Native Method) WARN/ActivityManager(124): Force finishing activity com.comp.ias/.MainActivity WARN/ActivityManager(124): Activity pause timeout for HistoryRecord{43f755b0 com.comp.ias/.MainActivity} WARN/WindowManager(124): No window to dispatch pointer action 1
- Transmisión de video en vivo entre dos teléfonos Android
- Mover vídeo ... usar animación de traducción
- Android: No se puede establecer el fondo de VideoView a transparente
- Reproducir archivo de vídeo desde el almacenamiento interno android mediante VideoView
- VideoView dentro de DialogFragment
- ¿Cómo transmitir vídeo desde url y jugar en android?
- Error de VideoView getCurrentPosition () en Acer Iconia A200
- Cómo prebuffer VideoView A mientras otro VideoView B está jugando - Android
Me di cuenta de que el problema era en realidad en el contexto que estaba usando. Tuve que usar, contexto de la actividad en lugar del contexto de la aplicación. Más específicamente, tenía que hacer:
MediaController mediaController = new MediaController(getActivity());
La documentación sobre cuándo utilizar el contexto es muy escasa. A veces, se puede usar cualquier contexto. A veces, necesitamos usar un contexto específico. Creo que la intuición detrás del uso del contexto es que "si una instancia de una clase se une a una actividad, utilice el contexto de la actividad, sino utilice el contexto de la aplicación".
- Pasar Contexto a ArrayAdapter dentro de Fragmento con setRetainInstance (true) causará la fuga?
- Android ANTLR hacer que no funciona correctamente