2011-06-22 13 views
8

Estoy intentando crear un fragmento de VideoViewer. A continuación se encuentran los 2 casos que he intentado y las observaciones. Para ambos casos las vistas del fragmento se infla a la siguiente distribución: Comportamiento extraño - Fragmento de VideoViewer que no funciona con MediaController

<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 el regulador de los medios de comunicación - 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 - aplicación falla cuando toco en 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(); 
} 

Se da la salida Logcat 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 

Respuesta

22

me di cuenta de que el problema era en realidad en el contexto estaba utilizando. Tuve que usar el contexto de la actividad en lugar del contexto de la aplicación. Más específicamente, tuve que hacer:

MediaController mediaController = new MediaController(getActivity()); 

La documentación sobre cuándo usar qué contexto es muy escasa. Algunas veces, cualquiera de los contextos puede ser usado. 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 está vinculada a una actividad, use contexto de actividad, de lo contrario use el contexto de la aplicación".

+0

De hecho, ese era el problema, sin embargo tengo una pregunta para usted: Estoy tratando de hacer lo mismo, pero el problema es que los botones MediaController no responden hacer ninguna acción, por lo que no pueden hacer una pausa/búsqueda/rebobinar el clip de transmisión? ¿Te ha pasado esto a ti también, o hay algo que me puede estar perdiendo? Estoy usando los fragmentos del paquete de compatibilidad: ¿es una causa probable? – r1k0

+0

Estaría casi loco por este error. Gracias @ 500865. – mertaydin

+0

@ 500865 Gracias por su contribución, me ayudó mucho. En mi opinión, la peor parte de Android es Contexto/Actividad. A veces, una función tiene un parámetro Contexto, pero en realidad se requiere Actividad. – Qylin