javascript - 带有 iframe 嵌入的 Android WebView 在 4.2.2 及以下版本上不显示

标签 javascript android iframe webview youtube

我目前正在尝试在我的 android 应用程序上实现一个 youtube 嵌入,它使用 WebView 来显示它的内容,我的目标是 API 14 及更高版本,但问题是 iframe youtube 嵌入没有显示在我的 4.2 webview 上.2 及以下但在 4.3 及以上版本上工作正常。我迷失了我错过的东西,但这里是我用来实现的代码示例:

String customHtml = "";

        String video; // = "<iframe src=\"http://www.youtube.com/embed/" + "dRvIiIVoVNw" + "\" width=\"100%\" height=\""+ 320 +"px\" frameborder=\"0\"></iframe>";

        video = "<div id=\"player\"></div>" +
                "    <script>" +
                "      var tag = document.createElement('script');" +
                "      tag.src = \"https://www.youtube.com/iframe_api\";" +
                "      var firstScriptTag = document.getElementsByTagName('script')[0];" +
                "      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);" +
                "      var player;" +
                "      function onYouTubeIframeAPIReady() {" +
                "        player = new YT.Player('player', {" +
                "          height: '390'," +
                "          width: '640'," +
                "          videoId: 'dRvIiIVoVNw'," +
                "          events: {" +
                "            'onReady': onPlayerReady," +
                "            'onStateChange': onPlayerStateChange" +
                "          }" +
                "        });" +
                "      }" +
                "      function onPlayerReady(event) {" +
                "        event.target.playVideo();" +
                "      }" +
                "      var done = false;" +
                "      function onPlayerStateChange(event) {" +
                "        if (event.data == YT.PlayerState.PLAYING && !done) {" +
                "          setTimeout(stopVideo, 6000);" +
                "          done = true;" +
                "        }" +
                "      }" +
                "      function stopVideo() {" +
                "        player.stopVideo();" +
                "      }" +
                "    </script>";

        customHtml = "<html>" + "<body>"
                    /*add the video here*/
                + video
                + "<b><font size=\""
                + 5 + "\">"
                //+ "<div id='wrap'>"
                + "Test title"
                + "</font></b>"
                + "<font size=\"" + 3 + "\"><br><br><i>Detail1: " + "Test" + "<br/>" + new_date + "<br />Detail2: "+ "Test" +"</i></font><br><br>"
                + "<font size=\"" + 3 + "\">"
                + "Detail content" + "</font>"
                + "<br><br><br></body></html>";

        webView.loadData(customHtml, "text/html; charset=utf-8", "UTF-8");
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient());
        webView.getSettings().setPluginState(WebSettings.PluginState.ON);
        webView.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND);
        webView.setWebViewClient(new DetailWebViewClient());

DetailWebViewClient 只是一个简单的覆盖:

private class DetailWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.contains("http")) {
                Intent webView = new Intent(getBaseContext(), ActivityWebView.class);
                webView.putExtra("url", url);
                startActivity(webView);
                return true;
            }
            return false;
        }

        @Override
        public void onReceivedError(WebView view, int errorCode,
                                    String description, String callbackUrl) {

            super.onReceivedError(view, errorCode, description, callbackUrl);

            Toast.makeText(getBaseContext(),
                    description + " errorcode=" + errorCode, Toast.LENGTH_SHORT)
                    .show();

        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
        }

    }

现在我尝试的是 iframe 和 iframe API here但两者都没有运气。

我还在我的 list 上使用了 android:hardwareAccelerated="true" 但仍然不起作用。我还搜索了具有相同问题的其他问题,但所有这些解决方案在我这边都不起作用(WebChromeClient、PluginsEnabled、HardwareAccelerated)。希望你们任何人都可以帮助我。

最佳答案

已经修复了,问题是这些行:

webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND);

所以这是我使用的完整 webview 设置:

        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.getSettings().setSupportMultipleWindows(true);
        webView.setWebChromeClient(new WebChromeClient());
        webView.setHorizontalScrollBarEnabled(false);
        webView.loadData(customHtml, "text/html; video/mpeg", "UTF-8");
        webView.setWebViewClient(new DetailWebViewClient());

好了,你现在可以在我这边正常工作了。 :)

关于javascript - 带有 iframe 嵌入的 Android WebView 在 4.2.2 及以下版本上不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29339961/

相关文章:

javascript - try catch javascript 语句中的未识别错​​误

android - 预蜂窝设备上的 state_activated

java - 将 JAR 文件添加到 Android Studio 项目时出错

Android:发送短信并使其显示在短信收件箱中?

javascript - 获取 IFrame 子项高度时出错

Firefox 在浏览器的新选项卡中打开针对 iFrame 的链接

javascript - 如何通过 linkText/linkName 严格地在表的隐藏行之一中找到特定链接(不使用 css-selectors 或 xpath)?

javascript - jquery 倒计时器 - 按键时重置

c# - 使用带有返回值的 C# CodeBehind 调用 jQuery 函数

iframe - 我可以将 rel nofollow 添加到 iframe 标签吗?