Android 7.0及以上Javascript无法正常使用Webview

时间:2018-03-06 05:23:52

标签: javascript android android-webview

我正在使用WebView在我的应用程序中集成支付网关。我想从HTML内容中读取响应,基本上它是一个JSON对象。这在6.0设备上运行正常。但对于7.0和8.0,我面临着JavaScript的问题。我使用以下代码。

我的代码

    vPayment.loadUrl(myurl);

    wvPayment.getSettings().setJavaScriptEnabled(true);
    wvPayment.getSettings().setDomStorageEnabled(true);
    wvPayment.clearCache(true);
    wvPayment.clearHistory();
    wvPayment.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    wvPayment.addJavascriptInterface(iface, "HTMLOUT");
    wvPayment.setWebChromeClient(new WebChromeClient());
    wvPayment.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            if (request.getUrl().toString().contains("mysuuccessurl")) {
                try {
                    String html = URLDecoder.decode(request.getUrl().toString(), "UTF-8").substring(9);
                    System.out.println("html" + html);
                } catch (UnsupportedEncodingException e) {
                    Log.e("example", "failed to decode source", e);
                }
            }

            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            System.out.println("Start url : " + url);
            customProgressDialog.show();
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            System.out.println("Finish url : " + url);
            if (url.contains(mysuccessurl)) {
                wvPayment.loadUrl("javascript:window.HTMLOUT.showHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
            }
            customProgressDialog.dismiss();
        }
    });
JIFace iface = new JIFace();


class JIFace {
    @android.webkit.JavascriptInterface
    public void showHTML(String data) {
       //want to handle the response here

        }
    }
}

上述代码有什么问题。 7.0及以上Android设备上的这项工作需要进行哪些更改

2 个答案:

答案 0 :(得分:1)

来自Android文档

这是Android N之前的

@Deprecated
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    return false;
}

这是Android N

@return如果主机应用程序想要离开当前的WebView,则为True         并处理url本身,否则返回false。

@Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        return true;
    }

此方法来自Android N,因此出于这个原因,您只在Android N中遇到此问题。如果返回false,则应解决问题。

答案 1 :(得分:0)

对于任何也磕磕绊绊的人我发现7以下的Android版本允许渲染“.cshtml”文件但是从android 7 nougart开始(7.0,7.1,8.0,8.1等...)只会输出他们的源代码。

我使用的是asp.net项目生成的一些cshtml文件,我将文件从该项目复制到我的xamarin项目中。

将文件的扩展名更改为.html为我修复了它。 :)