WebView使用踩坑记录

大前端是趋势,最近有两个项目涉及到原生跟H5嵌套以及交互,那WebView必不可少,以为会很顺利,结果这中间还是踩了不少坑。

H5调用相机无反应

H5集成进来之后,测试发现,点击调起相机,无反应,然后IOS是正常的,我….好吧,Android就是这么独特。

Google了一番,发现,高版本的Android系统,WebView出于安全性考虑,限制H5访问本地文件。需要重写 WebviewChromeClient中的 openFileChooser()onShowFileChooser()方法响应H5的<input type="file">,使用原生代码来调用本地相机和相册,然后在onActiivtyResult把选择的图片 URI 回传给 WebviewChromeClient

1
PS:注意Fragment与Activity的onStartActivityForResult区别,开了混淆的话,不要混淆onShowFileChooser()方法。

具体使用方式,网络有很多,这里有不详细介绍了,只记录下解题思路。参考博客

百度地图定位偏差

项目中因为客户要求定位必须使用百度地图,所以,就出现了定位偏差的问题,IOS继续正常,Android定位偏差,继续填坑。H5通过IP定位,精度不好,有好几种解决方案。

1
2
3
4
H5先用高德地图定位,然后显示在百度地图上
降低targetSdkVersion版本到23
升级Http到Https
使用原生定位方法,将位置信息传给H5

方案1 任务量是H5的,无能为力
方案2 试了一下,没效果
方案3 Https升级要Money,So,忽略
方案4 使用WebView的JavascriptInterface开接口给JS。

缓存问题

同事写了一个加载WebView的模板,就无脑用了,如果出现网络异常,页面空白,网络正常后,还是空白页面,然后清除掉缓存就好了。额。。。然后就发现了如下这个配置:

1
2
3
4
5
6
7
8
如下设置项:
//关闭webView中的缓存
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

LOAD_CACHE_ELSE_NETWORK:只要本地有缓存,就从缓存中读取数据。
LOAD_DEFAULT:根据 Http 协议,决定是否从网络获取数据。
LOAD_NO_CACHE:不使用缓存,只从网络获取数据。
LOAD_CACHE_ONLY:不使用网络,只读本地缓存。

显示过小,缩放

WebView加载H5,显示很小,必须手势放大才可以,隐藏掉如下配置:自动适配屏幕大小

1
2
3
4
5
6
7
8
9
10
11
12
13
   //设置自适应屏幕,两者合用
// webSettings.setUseWideViewPort(true);//将图片调整到合适webview的大小
// webSettings.setLoadWithOverviewMode(true);//缩放至屏幕的大小
// webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

//支持缩放,默认为true,是下面的前提
// webSettings.setSupportZoom(true);
//设置内置的缩放控件,若上面是false,则该webview不可缩放,这个不管设置什么都不能缩放
// webSettings.setBuiltInZoomControls(true);
// webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);

//隐藏原生的缩放控件
// webSettings.setDisplayZoomControls(false);

H5页面跳转,隐藏底部toolBar

底部toolBar的某一个操作项集成了H5,进入H5之后,底部的toolBar仍然存在,需要隐藏掉toolBar,重写WebViewClientshouldOverrideUrlLoading()方法,URL给出标志,判断URL是否包含隐藏toolBar标志,如果包含,toolBar隐藏掉不显示。