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. Web ビューで
2. Youtube を開く
3. ビデオ ページの 1 つに移動します
4. ビデオの再生アイコンをクリックします
5. [重要] ロード中 (ビデオでは黒のまま)、フルスクリーン ボタンをクリックします提供された。
6. onShowCustomView 関数をトリガーすると、フルスクリーン ビデオが表示されます (Web ビューを非表示にし、ビデオ ビューのみを表示します)
。 7. 数秒間ビデオを再生
します
。 webview のビデオのサイズが変更され、約 1 ~ 2 秒でアプリがクラッシュし、いくつかのエラー メッセージが表示されます。
エラー メッセージ:
WebCore クラッシュを次の ErrorReportUtils に報告します。
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 の後でアプリが完全に動作します。