Android Pie系统中WebView无法加载CSS问题求助
解决Android 9 WebView加载外链CSS失败的问题
嘿,这个问题我之前帮不少开发者踩过坑——Android 9(Pie)的WebView在加载带外链资源的本地HTML时,确实会出现和低版本不一致的情况,你的代码在4-8正常但9失效,主要是两个核心原因在搞鬼:
问题根源
- 明文HTTP被默认拦截:Android 9开始强制启用了Cleartext Traffic限制,也就是默认禁止App发起明文HTTP请求。你的CSS链接是
http://example.com/style.css,属于明文HTTP,直接被系统拦下来了。 - Data Scheme的跨域限制收紧:你用
loadData()加载的HTML其实是在data:协议下的页面,Android 9对这类页面加载跨域资源的安全限制比之前严格了很多,导致外链CSS无法正常加载。
解决方案
快速临时解决:允许明文HTTP(不推荐生产环境)
如果你只是想快速验证,可以在AndroidManifest.xml的<application>标签里加个属性,放开明文流量限制:
<application ... android:usesCleartextTraffic="true">
推荐方案:改用loadDataWithBaseURL()
loadData()的局限性在这里就体现出来了,换成loadDataWithBaseURL()就能解决跨域问题——它可以指定页面的基准URL,让WebView知道外链资源的域名归属,自然就能正常加载了。修改你的代码:
StringBuilder data = new StringBuilder(); data.append("<HTML><HEAD><LINK href=\"http://example.com/style.css\" type=\"text/css\" rel=\"stylesheet\"/></HEAD><body>"); data.append(bundle.getString("content")); data.append("</body></HTML>"); // 第一个参数传入CSS所在的域名作为基准URL webView.loadDataWithBaseURL("http://example.com/", data.toString(), "text/html", "UTF-8", null);
生产环境最优解:配置网络安全文件
如果你的项目需要长期维护,推荐配合网络安全配置文件,只给指定域名放开明文权限,而不是全局允许,这样更安全:
- 创建
res/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <!-- 只允许example.com的明文请求 --> <domain includeSubdomains="true">example.com</domain> </domain-config> </network-security-config>
- 在
AndroidManifest.xml的<application>里引用这个配置:
<application ... android:networkSecurityConfig="@xml/network_security_config">
为啥低版本没问题?
Android 4到8的系统默认没有明文HTTP限制,而且对data:协议页面的跨域资源加载管得比较松,所以你的代码在这些版本能正常工作。
优先推荐用loadDataWithBaseURL()+网络安全配置的组合,既解决问题又保证安全性。
内容的提问来源于stack exchange,提问作者HedgDifuse
相关产品推荐
相关产品推荐

