it-swarm.com.de

Android WebView mit eingebettetem Youtube-Video, Vollbild-Taste hält Video ein

Ich habe ein Android-Webview, das einen WordPress-Blog lädt. Einige Blogbeiträge enthalten Youtube-Videos, bei denen ich möchte, dass der Benutzer auf Wunsch den Vollbildmodus erstellen kann. Das Problem ist, dass die Schaltfläche für den HTML5-Vollbildmodus beim Klicken nichts bewirkt, aber die Ansicht einfriert. Irgendwelche Ideen?

28
wilxjcherokee

Das ist etwas, was ich den letzten Tag oder so verbracht habe, um mir die Haare zu reißen. Basierend auf diversen Codes aus dem Web habe ich es geschafft, dass es funktioniert.

Zunächst müssen Sie eine benutzerdefinierte WebChromeClient-Klasse erstellen, die die Methoden onShowCustomView und onHideCustomView implementiert.

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

Grundsätzlich passiert hier, wenn die Vollbild-Taste gedrückt wird. Wir erstellen eine neue Ansicht, um das Video zu halten und die Hauptansicht auszublenden. Und wenn der Vollbildmodus geschlossen ist, machen wir das Gegenteil - entfernen Sie die neue Ansicht und zeigen Sie die ursprüngliche Ansicht an.

Sie müssen all diese Eigenschaften auch zu Ihrer Aktivitätsklasse hinzufügen:

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

Wahrscheinlich möchten Sie das Vollbildvideo schließen, wenn Sie die Zurück-Taste drücken:

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

Dann müssen Sie nur Ihre neue Klasse verwenden, wenn Sie Ihre Webansicht erstellen:

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

Dies funktioniert für mich auf Android 4.x. Nicht sicher über frühere Versionen, da meine App nicht auf sie abzielt.

Ich fand diese Links besonders nützlich: WebView und HTML5 <video> und http://code.google.com/p/html5webview/source/browse/trunk/HTML5WebView/src/org/itri/html5webview/ HTML5WebView.Java

49
Mark Parnell

Sie können eine externe YouTube-App starten, wenn Sie Video-URL-URLs verwenden.

So rufen Sie die Video-Info-URL ab Sie müssen die onLoadResource-Methode verwenden:

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