全屏时 HTML 5 视频崩溃

Posted

技术标签:

【中文标题】全屏时 HTML 5 视频崩溃【英文标题】:HTML 5 video crash when going fullscreen 【发布时间】:2012-10-20 20:06:54 【问题描述】:

我目前正在开发具有屏幕方向纵向的应用程序,并且我有需要全屏支持的 html 5 视频。我在 webview 中添加了一个 WebChromeClient,覆盖了一些方法。当我坚持纵向时一切正常,但是当我尝试在全屏时将方向切换为横向时,我遇到了崩溃。有什么线索吗?

重写方法:

public void onShowCustomView(View view, CustomViewCallback callback) 
    super.onShowCustomView(view, callback);
    if (mCustomViewContainer != null) 
        callback.onCustomViewHidden();
        return;
    
    if(interfazWeb==null)
        interfazWeb = (FragTabActivity) getActivity();
        if (view instanceof FrameLayout) 
            mCustomViewContainer = (FrameLayout) view;
            mCustomViewCallback = callback;
            interfazWeb.getCustomContentView().setVisibility(View.INVISIBLE);
            interfazWeb.addContentView(mCustomViewContainer, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT, Gravity.CENTER));
            interfazWeb.setBackDelegate(new BackDelegate()

                public boolean shouldOverrideBackButton() 
                    if(mCustomViewCallback!=null)//first calling onHideCustomView()
                        onHideCustomView();
                        return true;
                    
                    return false;
                

            );
            mCustomViewContainer.bringToFront();
            //interfazWeb.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        
    

    @Override
    public void onHideCustomView() 
        // TODO Auto-generated method stub
            if(interfazWeb==null)
                interfazWeb = (FragTabActivity) getActivity();
            if(mCustomViewContainer!=null)
                ViewGroup parent = (ViewGroup) interfazWeb.getCustomContentView().getParent();
                if(parent!=null)
                    parent.removeView(mCustomViewContainer);
                    interfazWeb.getCustomContentView().setVisibility(View.VISIBLE);
                
            
            if(mCustomViewCallback!=null)
                mCustomViewCallback.onCustomViewHidden();
                mCustomViewCallback = null;
            
            //interfazWeb.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        

        @Override
        public Bitmap getDefaultVideoPoster() 
            // TODO Auto-generated method stub
            return Bitmap.createBitmap(1, 1, Config.ARGB_8888);
        

        @Override
        public View getVideoLoadingProgressView() 
            // TODO Auto-generated method stub
            return new ProgressBar((Context) getActivity());
        

日志说:

10-31 11:09:36.336: E/androidRuntime(8098): java.lang.NullPointerException
10-31 11:09:36.336: E/AndroidRuntime(8098):     at android.webkit.HTML5VideoView.isPlaying(HTML5VideoView.java:122)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at android.webkit.HTML5VideoViewProxy$VideoPlayer.isPlaying(HTML5VideoViewProxy.java:253)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at android.webkit.HTML5VideoViewProxy.handleMessage(HTML5VideoViewProxy.java:402)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at android.os.Looper.loop(Looper.java:137)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at android.app.ActivityThread.main(ActivityThread.java:4758)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at java.lang.reflect.Method.invokeNative(Native Method)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at java.lang.reflect.Method.invoke(Method.java:511)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-31 11:09:36.336: E/AndroidRuntime(8098):     at dalvik.system.NativeStart.main(Native Method)

编辑:我的清单中有这一行:

android:configChanges="keyboardHidden|orientation|locale|screenLayout"

【问题讨论】:

你能帮我解决这个问题吗Issue 我遇到了完全相同的问题,但仅在 Galaxy S3 上,当您按下返回时(退出全屏) @Pauland 你得到这个问题的解决方案了吗?我在 S3 中也遇到了这个问题。你能帮帮我吗? @noundla 是我的旧代码(已解决)pastebin.com/2PFZd2XV 如果我记得,prb 是通过 onBackPressed 函数解决的 我想我在这里解决了:***.com/questions/34718725/… 【参考方案1】:

当您切换方向时,应用程序会从 oncreate 事件开始自行重置。它不仅仅是简单地改变高度和宽度以及相关的东西。这就是为什么您创建的控件之一出现空异常的原因这次不存在。可能是 HTML5View。

您应该做的是跟踪视频位置,并在切换时从最后一个位置开始重新加载所有控件。

【讨论】:

我目前正在以编程方式在活动级别处理方向更改。所以它不应该被破坏和重建 正如您所说的 Onur,尽管我保留了状态并处理配置更改,但在方向更改期间一切都被破坏了。我想我必须深入研究另一个应用程序源代码才能找到他们如何处理这部分。我只是希望能找到一个比默认网络浏览器更简单的例子。 如何重新加载所有控件。你能详细说明一下吗?【参考方案2】:

您可以尝试通过将其添加到您的 Activity 来处理 Manifest 中的方向更改:

android:configChanges="orientation|screenLayout"

我曾经遇到过同样的问题,但这对我有用。

【讨论】:

好吧,你提到 - 不是在原始问题中 - 你正在以编程方式处理方向更改,除非你设置我在清单中提到的属性,否则在任何情况下都不应该工作。所以也许你可以试试这种方法。

以上是关于全屏时 HTML 5 视频崩溃的主要内容,如果未能解决你的问题,请参考以下文章

当页面视频全屏时,将 Webview2 切换到全屏

当以 UIModalPresentationFormSheet 样式模式打开并且用户使视频全屏时,MPMoviePlayerController 控件

HTML5 退出视频全屏

在 HTML5 全屏视频上叠加

如何禁用全屏 HTML5 视频的默认控件?

React - 如何在 html5 中捕获全屏视频请求?