正如标题所述,当我在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,它就不会被调用,只是因上述错误而崩溃。我不知道如何解决它。
下面,您可以找到我的onHideCustomView
和onShowCustomView
代码,因为这是我认为可能存在错误的唯一地方。 KitKat中没有新的方法可以在视频播放完毕后告诉WebView。
onHideCustomView
感谢任何人都能给我的帮助。
答案 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);
}