Android 7.0 及更高版本 Javascript Webview 不工作
Android 7.0 and above Javascript not working 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 设备
上需要进行哪些更改
来自 Android 文档
这是前 Android N
@Deprecated
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
这是因为 Android N
@return 如果主机应用程序想要离开当前 WebView,则为真
并处理 url 本身,否则 return false.
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return true;
}
此方法来自 Android N ,因此您仅在 Android N 中遇到此问题。返回 false 应该可以解决您的问题。
对于同样遇到此问题的任何人,我发现 android 7 以下的版本允许呈现“.cshtml”文件,但从 android 7 nougart 开始(7.0 ,7.1,8.0,8.1 etc...) 只会输出它们的源代码。
我正在使用一些由 asp.net 项目生成的 cshtml 文件,我将这些文件从该项目复制到我的 xamarin 项目中。
将文件的扩展名更改为 .html 为我修复了它。 :)
我正在使用 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 设备
上需要进行哪些更改来自 Android 文档
这是前 Android N
@Deprecated
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
这是因为 Android N
@return 如果主机应用程序想要离开当前 WebView,则为真 并处理 url 本身,否则 return false.
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return true;
}
此方法来自 Android N ,因此您仅在 Android N 中遇到此问题。返回 false 应该可以解决您的问题。
对于同样遇到此问题的任何人,我发现 android 7 以下的版本允许呈现“.cshtml”文件,但从 android 7 nougart 开始(7.0 ,7.1,8.0,8.1 etc...) 只会输出它们的源代码。
我正在使用一些由 asp.net 项目生成的 cshtml 文件,我将这些文件从该项目复制到我的 xamarin 项目中。
将文件的扩展名更改为 .html 为我修复了它。 :)