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>
相关推荐
素师良码40 分钟前
第9篇:Android驱动踩坑实录:DSI RX FIFO前置脏0、数据错位复盘
android
夜雪一千1 小时前
如何在MySQL中实现字段级加密
android·数据库·mysql
夜雪一千1 小时前
MySQL 如何存储经纬度坐标:选型、建表、空间查询实战
android·mysql·adb
JMchen1 小时前
集成第三方 C/C++ 库到 Android NDK 项目:OpenCV 与 FFmpeg 实战指南
android·opencv·cmake
有毒的教程3 小时前
Dev-C++ 使用扩展库两种方式:DevPak一键安装 / 手动配置(重点)
android·c++·adb
mmsx3 小时前
Android 测绘数值基础:测量单位系统与七四参数、高程拟合
android
郑州光合科技余经理4 小时前
出海外卖平台:支付对接为什么要和下单收款分开
android·java·开发语言·前端·后端·php·ai编程
夜雪一千4 小时前
MySQL 如何提高查询速度:从索引、SQL、表结构到实战调优
android·sql·mysql
终端安全笔记4 小时前
配置锁状态那一栏查的是什么:报告里几项各自指向什么风险
android·前端·安全·ios
恋猫de小郭4 小时前
Kotlin Toolchain 0.13,JetBrains 推荐 KMP 都切换到到全新工具链
android·前端·flutter