8 Stimmen

Seltsames Verhalten - VideoViewer-Fragment funktioniert nicht mit MediaController

Ich versuche, ein VideoViewer-Fragment zu erstellen. Unten sind die 2 Fälle, die ich versucht habe und die Beobachtungen. Für beide Fälle wird die Ansicht des Fragments aus dem folgenden Layout aufgepumpt:

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

Fall 1: VideoView ohne Mediensteuerung - funktioniert gut. Nachfolgend finden Sie den Code für die onActivityCreated Methode

/* 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();
}

Fall 2: VideoView mit Mediensteuerung - App stürzt ab, wenn ich die VideoView berühre. Unten ist der Code für die onActivityCreated Methode

/* 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();
}

Die logcat-Ausgabe ist unten angegeben:

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

22voto

500865 Punkte 6674

Ich habe herausgefunden, dass das Problem tatsächlich in dem von mir verwendeten Kontext lag. Ich musste den Aktivitätskontext anstelle des Anwendungskontexts verwenden. Genauer gesagt, musste ich tun :

MediaController mediaController = new MediaController(getActivity());

Die Dokumentation darüber, wann welcher Kontext zu verwenden ist, ist sehr spärlich. Manchmal kann jeder der Kontexte verwendet werden. Manchmal müssen wir einen bestimmten Kontext verwenden. Ich denke, die Intuition hinter der Verwendung des Kontexts ist, dass "wenn eine Instanz einer Klasse an eine Aktivität gebunden ist, der Aktivitätskontext verwendet wird, ansonsten der Anwendungskontext".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X