2

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 の後でアプリが完全に動作します。

4

0 に答える 0