当视频在KitKat上结束时,Android WebView崩溃

时间:2014-01-06 20:58:36

标签: android webview

正如标题所述,当我在WebView中播放full-screen视频(即YouTube视频)并让它一直播放到最后时,WebView会与VM Aborting和{{一起崩溃1}}错误如下所示:

Fatal Signal 6 (SIGABRT)

我通常认为我在01-06 15:36:38.489: W/dalvikvm(2940): Invalid indirect reference 0x10 in decodeIndirectRef 01-06 15:36:38.489: I/dalvikvm(2940): "main" prio=5 tid=1 RUNNABLE 01-06 15:36:38.489: I/dalvikvm(2940): | group="main" sCount=0 dsCount=0 obj=0x41854ca8 self=0x418433c8 01-06 15:36:38.489: I/dalvikvm(2940): | sysTid=2940 nice=-6 sched=0/0 cgrp=apps handle=1074430292 01-06 15:36:38.489: I/dalvikvm(2940): | state=R schedstat=( 0 0 0 ) utm=413 stm=91 core=0 01-06 15:36:38.489: I/dalvikvm(2940): at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 01-06 15:36:38.489: I/dalvikvm(2940): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27) 01-06 15:36:38.489: I/dalvikvm(2940): at android.os.Handler.dispatchMessage(Handler.java:102) 01-06 15:36:38.489: I/dalvikvm(2940): at android.os.Looper.loop(Looper.java:136) 01-06 15:36:38.489: I/dalvikvm(2940): at android.app.ActivityThread.main(ActivityThread.java:5017) 01-06 15:36:38.489: I/dalvikvm(2940): at java.lang.reflect.Method.invokeNative(Native Method) 01-06 15:36:38.489: I/dalvikvm(2940): at java.lang.reflect.Method.invoke(Method.java:515) 01-06 15:36:38.489: I/dalvikvm(2940): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 01-06 15:36:38.489: I/dalvikvm(2940): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 01-06 15:36:38.489: I/dalvikvm(2940): at dalvik.system.NativeStart.main(Native Method) 01-06 15:36:38.489: E/dalvikvm(2940): VM aborting 01-06 15:36:38.489: A/libc(2940): Fatal signal 6 (SIGABRT) at 0x00000b7c (code=-6), thread 2940 (acr.browser) onHideCustomView中做错了什么,但我的代码看起来很好并且在Jelly Bean上工作。实际上,当我使用我用于Jelly Bean的旧代码时,将TargetSdk设置为18并播放视频,当视频完成并且没有错误时调用onShowCustomView。一旦我将其切换到TargetSdk 19,它就不会被调用,只是因上述错误而崩溃。我不知道如何解决它。

下面,您可以找到我的onHideCustomViewonShowCustomView代码,因为这是我认为可能存在错误的唯一地方。 KitKat中没有新的方法可以在视频播放完毕后告诉WebView。

onHideCustomView

感谢任何人都能给我的帮助。

2 个答案:

答案 0 :(得分:2)

我有一个类似的崩溃日志,但这是因为我试图做fragmentManager.popBackStackImmediate();当我将其切换到popBackStack()(不是立即)时,它运行正常。

所以这里是我使用webChromeClient测试的一些代码,在全屏YouTube视频中没有任何崩溃。

    webView.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
            {
                webView.setVisibility(View.GONE);


                mCustomViewContainer = new FrameLayout(MainActivity.this);
                mCustomViewContainer.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT));
                mCustomViewContainer.addView(view);
                ((ViewGroup) findViewById(android.R.id.content)).addView(mCustomViewContainer);

            }

            @Override
            public void onHideCustomView() {
                mCustomViewContainer.setVisibility(View.GONE);
                webView.setVisibility(View.VISIBLE);
            }
    });

答案 1 :(得分:2)

事实证明我的onHideCustomView方法中有一个小错误...显然是

mCustomViewCallback.onCustomViewHidden();
你的onHideCustomView()方法中的

会导致KitKat崩溃,这很奇怪,因为我直接从Android浏览器的源代码中获取了这段代码。无论如何,对于任何想知道的人来说,onHideCustomView的完整代码都在下面。

@Override
public void onHideCustomView() {
    if (mCustomView == null && mCustomViewCallback == null)
        return;
    mWebView.setVisibility(View.VISIBLE);
    mCustomView.setKeepScreenOn(false);
    setFullscreen(false);
    FrameLayout decor = (FrameLayout) getWindow().getDecorView();
    decor.removeView(mFullscreenContainer);
    mFullscreenContainer = null;
    mCustomView = null;
    setRequestedOrientation(mOriginalOrientation);
}