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>
相关推荐
2601_9495430118 小时前
Flutter for OpenHarmony垃圾分类指南App实战:主题配置实现
android·flutter
2601_9498333919 小时前
flutter_for_openharmony口腔护理app实战+知识实现
android·javascript·flutter
晚霞的不甘19 小时前
Flutter for OpenHarmony从基础到专业:深度解析新版番茄钟的倒计时优化
android·flutter·ui·正则表达式·前端框架·鸿蒙
鸟儿不吃草19 小时前
android的Retrofit请求https://192.168.43.73:8080/报错:Handshake failed
android·retrofit
Minilinux201819 小时前
Android音频系列(09)-AudioPolicyManager代码解析
android·音视频·apm·audiopolicy·音频策略
清山博客20 小时前
jQuery easyui 扩展datetimebox控件,增加上午、中午、下午快速选择
前端·jquery·easyui
李子红了时20 小时前
【无标题】
android
Android系统攻城狮21 小时前
Android tinyalsa深度解析之pcm_close调用流程与实战(一百零四)
android·pcm·tinyalsa·音频进阶·音频性能实战·android hal
weixin_4111918421 小时前
LifecycleEventObserver和DefaultLifecycleObserver使用
android
、BeYourself1 天前
Intent :跳转与数据传递的正确打开方式
android·android-studio