奇怪的行为 - 视频查看片段不工作的MediaController片段、奇怪、行为、工作

2023-09-07 04:18:04 作者:薄荷撞可乐

我想创建一个视频查看片段。下面是2情况下,我曾尝试和观察。对于这两种情况下,片段的观点是从以下布局膨胀:

 < RelativeLayout的的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:重力=中心>

< VideoView机器人:ID =@ + ID / fragment_video_viewer_video
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT
    机器人:layout_gravity =中心/>
< / RelativeLayout的>
 

案例1:没有媒体控制器VideoView - 工作正常。下面是code为 onActivityCreated 方法

  / *这里初始化变量,检索意见和* /
@覆盖
公共无效onActivityCreated(包savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    //分配的局部变量
    mVideoView =(VideoView)getView()findViewById(R.id.fragment_video_viewer_video)。
    mVideoView.setVideoPath(/ SD卡/ family_guy_test.3gp); //(videoUri);
    mVideoView.requestFocus();
    mVideoView.start();
}
 

案例2:VideoView与媒体控制器 - 当我触及VideoView 应用程序崩溃。下面是code为 onActivityCreated 方法

  / *这里初始化变量,检索意见和* /
@覆盖
公共无效onActivityCreated(包savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    //分配的局部变量
    mVideoView =(VideoView)getView()findViewById(R.id.fragment_video_viewer_video)。
    mVideoView.setVideoPath(/ SD卡/ family_guy_test.3gp); //(videoUri);
    的MediaController的MediaController =新的MediaController(getActivity()getApplicationContext());
    mediaController.setAnchorView(mVideoView);
    mVideoView.setMediaController(的MediaController);
    mVideoView.requestFocus();
}
 
一季度付费用户同比增长134 ,B站又往前迈了一步

在logcat的输出如下:

  WARN /窗口管理器(124):无法查找窗口
WARN /窗口管理器(124):java.lang.IllegalArgumentException:如果请求的窗口空不存在
WARN /窗口管理器(124):在com.android.server.WindowManagerService.windowForClientLocked(WindowManagerService.java:9398)
WARN /窗口管理器(124):在com.android.server.WindowManagerService.addWindow(WindowManagerService.java:1906)
WARN /窗口管理器(124):在com.android.server.WindowManagerService $ Session.add(WindowManagerService.java:6876)
WARN /窗口管理器(124):在android.view.IWindowSession $ Stub.onTransact(IWindowSession.java:66)
WARN /窗口管理器(124):在com.android.server.WindowManagerService $ Session.onTransact(WindowManagerService.java:6848)
WARN /窗口管理器(124):在android.os.Binder.execTransact(Binder.java:288)
WARN /窗口管理器(124):在dalvik.system.NativeStart.run(本机方法)
WARN /窗口管理器(124):试图添加窗口令牌不是一个窗口:空。中止。
WARN / dalvikvm(8144):主题ID = 1:螺纹退出与未捕获的异常(组= 0x400287f0)
ERROR / AndroidRuntime(8144):致命异常:主要
ERROR / AndroidRuntime(8144):android.view.WindowManager $ BadTokenException:无法添加窗口 - 标记空无效;在您的活动运行?
ERROR / AndroidRuntime(8144):在android.view.ViewRoot.setView(ViewRoot.java:505)
ERROR / AndroidRuntime(8144):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
ERROR / AndroidRuntime(8144):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
ERROR / AndroidRuntime(8144):在android.widget.MediaController.show(MediaController.java:304)
ERROR / AndroidRuntime(8144):在android.widget.MediaController.show(MediaController.java:249)
ERROR / AndroidRuntime(8144):在android.widget.VideoView.toggleMediaControlsVisiblity(VideoView.java:567)
ERROR / AndroidRuntime(8144):在android.widget.VideoView.onTouchEvent(VideoView.java:518)
ERROR / AndroidRuntime(8144):在android.view.View.dispatchTouchEvent(View.java:3766)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
ERROR / AndroidRuntime(8144):在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
ERROR / AndroidRuntime(8144):在android.app.Activity.dispatchTouchEvent(Activity.java:2086)
ERROR / AndroidRuntime(8144):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
ERROR / AndroidRuntime(8144):在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
ERROR / AndroidRuntime(8144):在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
ERROR / AndroidRuntime(8144):在android.app.Activity.dispatchTouchEvent(Activity.java:2086)
ERROR / AndroidRuntime(8144):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
ERROR / AndroidRuntime(8144):在android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
ERROR / AndroidRuntime(8144):在android.os.Handler.dispatchMessage(Handler.java:99)
ERROR / AndroidRuntime(8144):在android.os.Looper.loop(Looper.java:123)
ERROR / AndroidRuntime(8144):在android.app.ActivityThread.main(ActivityThread.java:4627)
ERROR / AndroidRuntime(8144):在java.lang.reflect.Method.invokeNative(本机方法)
ERROR / AndroidRuntime(8144):在java.lang.reflect.Method.invoke(Method.java:521)
ERROR / AndroidRuntime(8144):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
ERROR / AndroidRuntime(8144):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR / AndroidRuntime(8144):在dalvik.system.NativeStart.main(本机方法)
WARN / ActivityManager(124):强制完成活动com.comp.ias / .MainActivity
WARN / ActivityManager(124):活动暂停超时HistoryRecord {43f755b0 com.comp.ias / .MainActivity}
WARN /窗口管理器(124):无窗派遣指针动作1
 

解决方案

我想通了,这个问题实际上是在我使用的环境。我不得不使用,活动范围内,而不是应用程序上下文的。更具体地讲,我不得不这样做:

 的MediaController的MediaController =新的MediaController(getActivity());
 

时要使用的环境是非常稀疏的文档。有时,任何上下文的都可以使用。有时候,我们需要用一个特定的背景。我想,身后背景下使用的直觉是,如果一个类的实例绑定到一个活动,利用活动的背景下,其他人使用的应用程序上下文。

I am trying to create a VideoViewer fragment. Below are the 2 cases I have tried and the observations. For both the cases the fragment's view is inflated from the following layout:

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

Case 1: VideoView without media controller - works fine. Below is the code for the onActivityCreated method

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

Case 2: VideoView with media controller - App Crashes when I touch on the VideoView. Below is the code for the onActivityCreated method

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

The logcat output is given below :

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

解决方案

I figured out that the problem was actually in the context I was using. I had to use, Activity context instead of the application context. More specifically, I had to do :

MediaController mediaController = new MediaController(getActivity());

The documentation on when to use which context is very sparse. Sometimes, any of the context can be used. Sometimes, we need to use a specific context. I think the intuition behind usage of context is that, "if an instance of a class is binded to an activity, use activity context, else use application context".

 
精彩推荐
图片推荐