webview初始化代码
java
private void initWebView() {
webView.setWebViewClient(webClient);
webView.setWebChromeClient(webChromeClient);
WebSettings webSettings = webView.getSettings();
// 让WebView能够执行javaScript
webSettings.setJavaScriptEnabled(true);
// 让JavaScript可以自动打开windows
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
// 设置是否缓存
webSettings.setAppCacheEnabled(false);
// 设置缓存模式,一共有四种模式
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
// 支持缩放(适配到当前屏幕)
webSettings.setSupportZoom(true);
// 将图片调整到合适的大小
webSettings.setUseWideViewPort(true);
// 支持内容重新布局,一共有四种方式
// 默认的是NARROW_COLUMNS
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
// 设置可以被显示的屏幕控制
webSettings.setDisplayZoomControls(true);
// 设置不用客户触摸就可以播放音频
webSettings.setMediaPlaybackRequiresUserGesture(false);
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
// 设置默认字体大小
//webSettings.setDefaultFontSize(12);
// 设置响应超链接,在安卓5.0系统,不使用下面语句超链接也是正常的,但在MIUI中安卓4.4.4中需要使用下面这条语句,才能响应超链接
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setDomStorageEnabled(true);
//APP提供JS调用接口
webView.addJavascriptInterface(new XTenJSBridge(), "XTenJSBridge");
//设置可以访问file
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
/**
* 加载页面地址,支持Web链接或者"file:///android_asset/html/index.html"
*/
webView.loadUrl("file:///android_asset/html/index.html");
}
其中,setAllowFileAccess、setAllowFileAccessFromFileURLs、setAllowContentAccess、setAllowUniversalAccessFromFileURLs是因为出现ajax请求error时新增的。
下面是标准的jquery的ajax请求代码
js
$.ajax({
type:"GET",
url:"getUser",
// data:{"id":val}, // data参数是可选的,有多种写法,也还可以直接在url参数拼接参数上去,例如这样:url:"getUser?id="+val,
data:"id="+val,
async:true, // 异步,默认开启,也就是$.ajax后面的代码是不是跟$.ajx里面的代码一起执行
cache:true, // 表示浏览器是否缓存被请求页面,默认是 true
dataType:"json", // 返回浏览器的数据类型,指定是json格式,前端这里才可以解析json数据
success:function(data){
console.log(data);
},
error:function(xhr,status,error){
console.log(error);
},
complete:function(){
console.log("最终操作在这里完成");
}
});
// alert("测试异步")
}
我提交的请求地址是: http://192.168.2.88/api/login
结果已请求就进入error函数,当然你可以打印一下看看error对象
XMLHttpRequest:XMLHttpRequest.readyState: 状态码的意思
0 - (未初始化)还没有调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,可以在客户端调用了
结果,我这边显示是:
{"readyState":0,"status":0,"statusText":"error"}
然后才知道,原来在android9以后,是不允许请求http请求的,需要换成https,之前项目一直调用的都是https格式的,所以一直没有注意到这个细节,那怎么改才可以兼容http请求呢?
同理,如果WebView加载http开头的网页,也会出现net:ERR_CLEARTEXT_NOT_PERMITTED错误,也是同样解决方案
解决方案:
如果你需要允许特定的HTTP网站,可以在你的应用的AndroidManifest.xml中添加android:usesCleartextTraffic属性
xml
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>