我有一个使用RelativeLayout 来保存webview 的片段,并为其分配了一个自定义WebChromeClient。当我使用 webview 观看 Youtube 视频时,它可以在单独的视图中显示视频。但是,当我退出单独的视图并返回 webview 时,应用程序崩溃了。
/*Here is part of my WebChromeClient*/
public class CustomWebChromeClient extends WebChromeClient {
/*Function for showing video separate from webview*/
public void onShowCustomView(View view, CustomViewCallback callback) {
frag.mCustomViewCallback = callback;
//mTargetView is used as a video holder for holding the video object
frag.mTargetView.addView(view);
//mCustomView is the video object itself
frag.mCustomView = view;
//hide webview
frag.webview.setVisibility(View.GONE);
//show video holder with its video
frag.mTargetView.setVisibility(View.VISIBLE);
frag.mTargetView.bringToFront();
}
@Override
public void onHideCustomView() {
if (frag.mCustomView == null)
return;
//(I guess) use callback to hide video player widget such as play button and timebar
frag.mCustomViewCallback.onCustomViewHidden();
//remove video object from holder
frag.mTargetView.removeView(frag.mCustomView);
//hide video
frag.mCustomView.setVisibility(View.GONE);
frag.mCustomView = null;
//hide video hodler
frag.mTargetView.setVisibility(View.GONE);
//show webview again
frag.webview.setVisibility(View.VISIBLE);
}
/*... some other codes ...*/
}
在我的主要片段活动中
/*Hide video holder when back key pressed*/
public void onBackPressed() {
/*if is showing video, hide the view*/
if(isShowingVideo){
myWebChromeClient.onHideCustomView();
}
}
详细情况:
1.在我的webview
2.打开Youtube
3.转到其中一个视频页面
4.点击视频的播放图标
5.[重要]当它还在加载时(在视频上保持黑色),点击全屏按钮假如。
6.触发onShowCustomView功能,然后全屏视频显示(隐藏webview只显示视频视图)
7.视频播放几秒钟
8.按返回键,触发onHideCustomView。(隐藏视频视图只显示webview)
9. webview 的视频已调整大小,大约 1~2 秒,应用程序崩溃并收到一些错误消息。
错误消息:
向 ErrorReportUtils 报告 WebCore 崩溃:
Thu Dec 11 17:37:11
Fatal signal 11 (SIGSEGV) at 0x000030de (code=0), thread 12526 (WebViewCoreThre)
[unnamed-12510-1] updateTexImage: SurfaceTexture is not attached to an OpenGL ES context
我发现了什么:
1. 不使用“mCustomViewCallback.onCustomViewHidden();” 在 onHideCustomView() 内部,应用程序不会崩溃,
但由 mCustomView(视频对象)创建的视频播放器小部件仍然存在。
2.在情况5,如果我等到视频内容显示,然后单击全屏按钮,应用程序在情况6~8之后可以正常工作。