web-dev-qa-db-ja.com

Android youtubeビデオが埋め込まれたWebView、フルスクリーンボタンでビデオがフリーズする

Androidブログをロードするwordpress webviewがあります。一部のブログ投稿にはユーチューブビデオが含まれており、ユーザーが希望する場合は全画面表示できるようにしたいと考えています。問題は、クリックしてもHTML5全画面ボタンが何もしないのにビューがフリーズすることです。何か案は?

28
wilxjcherokee

これは私が最後の日かそこらで髪を引き裂いて過ごしたものです。ウェブ上のさまざまなコードに基づいて、私はなんとか動作させることができました。

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

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();
}

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

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

これはAndroid 4.x.で動作します。アプリがターゲットにしないため、以前のバージョンについてはわかりません。

これらのリンクは特に便利だと思いました: WebView and HTML5 <video> and http://code.google.com/p/html5webview/source/browse/trunk/HTML5WebView/src/org /itri/html5webview/HTML5WebView.Java

49
Mark Parnell

アプリケーションで直接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);
        }
    }
}
0
Roman Black