2011-06-22 20 views
8

我想創建一個VideoViewer片段。以下是我嘗試過的兩例和觀察結果。對於這兩種情況下,片段的畫面從以下佈局充氣: 奇怪的行爲 - VideoViewer片段不與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> 

案例1:VideoView沒有媒體控制器 -工作正常。下面是該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(); 
} 

案例2:VideoView與媒體控制器 -應用程序崩潰,當我觸摸了VideoView。下面是

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

的logcat的輸出如下給出了onActivityCreated方法的代碼:

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 

回答

22

我想通了,這個問題實際上是在我的背景使用。我必須使用Activity上下文,而不是應用程序上下文。更具體地說,我必須這樣做:

MediaController mediaController = new MediaController(getActivity()); 

有關何時使用哪些上下文非常稀疏的文檔。有時候,可以使用任何上下文。有時候,我們需要使用特定的上下文。我認爲,上下文使用背後的直覺是,「如果一個類的實例綁定到一個活動,使用活動上下文,否則使用應用程序上下文」。

+0

確實,這是問題所在,但是我對你有一個問題:我試圖做同樣的事情,但問題是MediaController按鈕不響應做任何操作,所以我不能暫停/尋找/倒回流剪輯?這件事是否也發生在你身上,或者是否有我可能錯過的東西?我正在使用兼容包中的碎片 - 這是可能的原因嗎? – r1k0

+0

因爲這個錯誤,我會幾乎瘋狂。謝謝@ 500865。 – mertaydin

+0

@ 500865感謝您的意見,它對我有很大的幫助。在我看來,Android最糟糕的部分是上下文/活動。有時候,一個函數有一個Context參數,但實際上需要Activity。 – Qylin