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

 /* 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 

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".

  • Android Video no se ajusta a la anchura en el retrato de la videovista y no ocupa la pantalla completa en el paisaje
  • MediaPlayer error (1, -1004) ¿Por qué?
  • VideoView se convierte en pantalla negra
  • VideoView getDrawingCache devuelve negro
  • Android :: VideoView dentro de un ScrollView
  • Obtener el camino real para Uri Android
  • Error de MediaPlayer / VideoView de Android (1, -2147483648)
  • ¿Hay una manera de hacer que VideoView siga jugando en segundo plano en la aplicación para Android?
  • Cómo hacer que una videoview NO se inicie automáticamente después de preparado
  • ANDROID - Cómo utilizar un video como fondo en Andengine
  • Fragmento retenido no retenido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.