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>
相关推荐
inmK14 小时前
蓝奏云官方版不好用?蓝云最后一版实测:轻量化 + 不限速(避更新坑) 蓝云、蓝奏云第三方安卓版、蓝云最后一版、蓝奏云无广告管理工具、安卓网盘轻量化 APP
android·工具·网盘工具
giaoho4 小时前
Android 热点开发的相关api总结
android
咖啡の猫6 小时前
Android开发-常用布局
android·gitee
程序员老刘6 小时前
Google突然“变脸“,2026年要给全球开发者上“紧箍咒“?
android·flutter·客户端
Tans56 小时前
Androidx Lifecycle 源码阅读笔记
android·android jetpack·源码阅读
雨白7 小时前
实现双向滑动的 ScalableImageView(下)
android
峥嵘life7 小时前
Android Studio新版本编译release版本apk实现
android·ide·android studio
studyForMokey9 小时前
【Android 消息机制】Handler
android
敲代码的鱼哇9 小时前
跳转原生系统设置插件 支持安卓/iOS/鸿蒙UTS组件
android·ios·harmonyos
翻滚丷大头鱼9 小时前
android View详解—动画
android