Android中webview中本地加载网页,jquery发送ajax请求一直报error的解决办法

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>
相关推荐
花花鱼1 小时前
android studio 设置让开发更加的方便,比如可以查看变量的类型,参数的名称等等
android·ide·android studio
alexhilton2 小时前
为什么你的App总是忘记所有事情
android·kotlin·android jetpack
一瓣橙子5 小时前
7.7日 实验03-Spark批处理开发(2)
开发语言·javascript·ajax
Hilaku5 小时前
从一个实战项目,看懂 `new DataTransfer()` 的三大妙用
前端·javascript·jquery
AirDroid_cn6 小时前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
尊治6 小时前
手机电工仿真软件更新了
android
xiangzhihong88 小时前
使用Universal Links与Android App Links实现网页无缝跳转至应用
android·ios
车载应用猿9 小时前
基于Android14的CarService 启动流程分析
android
没有了遇见10 小时前
Android 渐变色实现总结
android
爱喝水的小周12 小时前
AJAX vs axios vs fetch
前端·javascript·ajax