WebView网页加载适配

目前Android项目中使用WebView加载网页的情况很多,常见的就是 加载服务器上的网页 和 加载本地的网页两种;

1、加载服务器上的网页

mWebView.loadUrl("http://www.baidu.com");

2、加载本地的html的两种方式(assets 与 raw)

本地的html文件一般放置在assets目录 或者 res–>raw目录下,而两种放置方式,使用webView加载的地址也是不一样的

**1)**当html文件放在assets目录下时 (test为子目录,en为国家语言标识,demo.html为目标文件)

mWebView.loadUrl("file:///android_asset/test/en/demo.html");

**2)**当html放置在res–>raw目录下时

mWebView.loadUrl("file:///android_res/raw/demo.html");

放置assets目录下和raw目录下的区别:

1> assets目录下可以新建子目录,raw目录下不可以有子目录,只能将文件放在根目录下,如raw/demo.html ;

2> 系统加载方式不同,如果适配国家语言(如 zh-中文 en-英文 )的话,assets目录下的文件会分别创建两个zh和en的目录,再去根据系统语言加载对应的地址,例如:

if(中文){
	mWebView.loadUrl("file:///android_asset/test/zh/demo.html");
} else if (英文){
	mWebView.loadUrl("file:///android_asset/test/en/demo.html");
}else{
	 mWebView.loadUrl("file:///android_asset/test/en/demo.html");
}

而raw则方便很多,只需要创建多个目录即可,例如:
raw-zh raw-en

mWebView.loadUrl("file:///android_res/raw/demo.html");
当系统语言为英文时,webview会自动加载raw-en里边的html,中文也是如此;

3、使用WebView加载网页时遇到的问题

问题1:加载本地html网页时,文件放在raw时,网页加载出来格式显示错误,但是html放在assets目录下可显示正常

原因分析:大部分原因是由于html不规范,导致html网页加载之后无法正常显示

解决方案:检查格式显示不对的html,外部标签是否为 内容 ,如果不是,加入此外部标签(或使用标准html网页文档)即可;

问题2:Android 9.0加载网页失败,出现提示net::ERR_CLEARTEXT_NOT_PERMITTED

原因分析:android9.0 默认情况下禁用明文支持。因此http的url均无法在webview中加载;

解决方案:

第一步:书写network_security_config.xml 放入res–>xml目录下

第一种情况:只信任指定域名下的网址链接,如 域名1 和域名2

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">域名1</domain>
        <domain includeSubdomains="true">域名2</domain>
    </domain-config>
</network-security-config>

第二种情况:信任所有的网址链接

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
     <base-config cleartextTrafficPermitted="true">
</network-security-config>

注意:如果使用Charles 抓包,需要单独配置,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

第二步:AndroidManifest --> Application 标签中加入:

android:networkSecurityConfig="@xml/network_security_config"

此时,Android9.0的手机上就可以正常显示要加载的http网址了;