1

私はこの問題に少なくとも 1 週間取り組んできました。StackOverflow でそれに関するすべての投稿を読みましたが、まだ解決策が見つからず、これは不可能だと考え始めています。

次のようなレイアウトに埋め込まれた Web ビューに HTML を表示したい:

問題のスキーム

問題は、その HTML コードに HTML5 ビデオが含まれている場合、Android OS のバグが原因でトリミングされることです: Link to bug

多くの回避策を試しましたが、どれも機能していないようです。私の最後の試みは、Jelly Bean よりも低いデバイスのフルスクリーンでビデオを表示することです (このバージョンのエラーは修正されています)。

表示する必要がある HTML を制御することはできません。そのため、何かを行う唯一の方法は、javascript コードを挿入することです。現在、両方の onShowCustomView を処理してフルスクリーンにしています。

setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        if (android_sdk < JELLY_BEAN) {
            detectVideoOnWebPage();
        }
    }
});

private void detectVideoOnWebPage() {
    // Run javascript code that detects the video end and notifies the
    // interface
    String js = "javascript:";
    js += "_ytrp_html5_video = document.getElementsByTagName('VIDEO')[0];";
    js += "if (_ytrp_html5_video !== undefined) {";
    {

        js += "_ytrp_html5_video.webkitEnterFullScreen();";
        js += "_VideoEnabledWebView.notifyVideoPresence();";
        js += "function video_start_playing() {";
        {
            js += "_VideoPlayed.notifyVideoStarted();";
            js += "ev.target.removeEventListener('playing', video_start_playing);";

        }
        js += "}";
        js += "ev.target.addEventListener('playing', video_start);";
    }
    js += "} else if (document.getElementsByTagName('iframe')) {";
    {
        js += "_VideoEnabledWebView.notifyVideoPresence();";
    }
    js += "} else {";
    {
        js += "var handler = function(ev) {";
        {
            js += "if (ev.target.nodeName.toUpperCase() === \"VIDEO\".toUpperCase()) {";
            {
                js += "function video_start_playing() {";
                {
                    js += "_VideoPlayed.notifyVideoStarted();";
                    js += "ev.target.webkitEnterFullScreen();";
                }
                js += "}";
                js += "ev.target.addEventListener('play', video_start_playing);";
                js += "_VideoDetected.notifyVideoPresence();";
                js += "document.removeEventListener (\"DOMNodeInserted\", handler);";
            }
            js += "} else {";
            {
                js += "_ytrp_html5_video = document.getElementsByTagName('VIDEO')[0];";
                js += "if (_ytrp_html5_video !== undefined) {";
                {
                    js += "_VideoEnabledWebView.notifyVideoPresence();";
                }
            }
            js += "};";
        }
        js += "};";
        js += "document.addEventListener (\"DOMNodeInserted\", handler);";
    }
    js += "}";
    loadUrl(js);
}

私の目標は:

  • html に html5 ビデオが含まれていることを検出します。
  • Jelly Bean より前の OS バージョンの場合は、全画面表示を強制します。

今、私は到達しました:

  • Ice Cream Sandwich より前のバージョンの iframe 内にない html5 ビデオをフルスクリーン モードで表示します (ICS は webkitEnterFullScreen を無視します)。
4

2 に答える 2

0

次のように、再生イベントでフルスクリーンをリクエストできます。

var element = document.getElementById("video");
element.addEventListener("playing", function() {
    if (element.requestFullscreen) {
        element.requestFullscreen();
    } else if (element.webkitRequestFullscreen) {
        element.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
    }
}, false);
于 2015-10-21T06:52:04.160 に答える
-2

次のように、ユーザー エージェントを ICS で動作する webView に設定することができます。

String ua = "Mozilla/5.0 (Android; Tablet; rv:20.0) Gecko/20.0 Firefox/20.0";

WebSettings s = webView.getSettings();
s.setUserAgentString(ua);

うまくいかない場合は、このリンクで他のユーザー エージェントを探してください

幸運を

于 2013-10-31T10:24:43.950 に答える