31

wordpress ブログをロードする android webview があります。一部のブログ投稿には、ユーザーが必要に応じて全画面表示できるようにしたい YouTube ビデオが含まれています。問題は、HTML5 のフル スクリーン ボタンをクリックしても何も起こらず、ビューがフリーズすることです。何か案は?

4

3 に答える 3

51

これは私が最後の日かそこらで私の髪を引き裂くのに費やしたものです. Web 上のさまざまなコードに基づいて、なんとか機能させることができました。

最初に、およびメソッドWebChromeClientを実装するカスタム クラスを作成する必要があります。onShowCustomViewonHideCustomView

private class MyWebChromeClient extends WebChromeClient {
    FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
            FrameLayout.LayoutParams.MATCH_PARENT);

    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
        // if a view already exists then immediately terminate the new one
        if (mCustomView != null) {
            callback.onCustomViewHidden();
            return;
        }
        mContentView = (RelativeLayout) findViewById(R.id.activity_main);
        mContentView.setVisibility(View.GONE);
        mCustomViewContainer = new FrameLayout(MainActivity.this);
        mCustomViewContainer.setLayoutParams(LayoutParameters);
        mCustomViewContainer.setBackgroundResource(android.R.color.black);
        view.setLayoutParams(LayoutParameters);
        mCustomViewContainer.addView(view);
        mCustomView = view;
        mCustomViewCallback = callback;
        mCustomViewContainer.setVisibility(View.VISIBLE);
        setContentView(mCustomViewContainer);
    }

    @Override
    public void onHideCustomView() {
        if (mCustomView == null) {
            return;
        } else {
            // Hide the custom view.  
            mCustomView.setVisibility(View.GONE);
            // Remove the custom view from its container.  
            mCustomViewContainer.removeView(mCustomView);
            mCustomView = null;
            mCustomViewContainer.setVisibility(View.GONE);
            mCustomViewCallback.onCustomViewHidden();
            // Show the content view.  
            mContentView.setVisibility(View.VISIBLE);
            setContentView(mContentView);
        }
    }
}

基本的に、ここで起こっていることは、全画面表示ボタンが押されたときに、ビデオを保持する新しいビューを作成し、メイン ビューを非表示にすることです。フルスクリーンが閉じられると、反対のことを行います - 新しいビューを取り除き、元のビューを表示します。

これらすべてのプロパティをアクティビティ クラスに追加する必要もあります。

private MyWebChromeClient mWebChromeClient = null;
private View mCustomView;
private RelativeLayout mContentView;
private FrameLayout mCustomViewContainer;
private WebChromeClient.CustomViewCallback mCustomViewCallback;

また、戻るボタンが押されたときにフルスクリーンのビデオを閉じるようにしたいでしょう:

@Override
public void onBackPressed() {
    if (mCustomViewContainer != null)
        mWebChromeClient.onHideCustomView();
    else if (myWebView.canGoBack())
        myWebView.goBack();
    else
        super.onBackPressed();
}

次に、WebView を作成するときに新しいクラスを使用するだけです。

myWebView = (WebView) findViewById(R.id.webView1);
mWebChromeClient = new WMWebChromeClient();
myWebView.setWebChromeClient(mWebChromeClient);

これは、Android 4.x で動作します。私のアプリはそれらを対象としていないため、以前のバージョンについてはわかりません。

これらのリンクが特に役立つことがわかりました: WebView と HTML5 <video>およびhttp://code.google.com/p/html5webview/source/browse/trunk/HTML5WebView/src/org/itri/html5webview/HTML5WebView.java

于 2013-02-28T03:43:05.007 に答える
0

アプリケーションで YouTube ビデオを直接表示することが重要でない場合は、ビデオ情報の URL を取得するときに、外部の YouTube アプリを起動できます。

動画情報の URL を取得するには、onLoadResourceメソッドをオーバーライドする必要があります。

new WebViewClient() {

    @Override
    public void onLoadResource(WebView view, String url) {

        if (url.startsWith("http://www.youtube.com/get_video_info?")) {
            try {
                String path = url.replace("http://www.youtube.com/get_video_info?", "");

                String[] parqamValuePairs = path.split("&");

                String videoId = null;

                for (String pair : parqamValuePairs) {
                    if (pair.startsWith("video_id")) {
                        videoId = pair.split("=")[1];
                        break;
                    }
                }

                if(videoId != null){
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com"))
                            .setData(Uri.parse("http://www.youtube.com/watch?v=" + videoId)));
                    needRefresh = true;

                    return;
                }
            } catch (Exception ex) {
            }
        } else {
            super.onLoadResource(view, url);
        }
    }
}
于 2014-07-24T09:28:07.527 に答える