最近做无线WiFi的时候,在最后认证成功的时候会弹出一个广告页,于是用webview去加载了一下,结果没反应,打印url出来看了一下,发现是https格式的,在使用WebView加载https资源文件时,如果认证证书不被Android认可,那么会出现无法成功加载对应资源问题。那么,我们就要针对这一状况作出对应的处理。
于是百度了一下,这里记录一下,给大家做个参考:
1、设置WebView接受所有网站的证书
在认证证书不被Android所接受的情况下,我们可以通过设置重写WebViewClient的onReceivedSslError方法在其中设置接受所有网站的证书来解决,重写WebView的onReceivedSslError方法,添加handler.proceed方法,但App如果上架GooglePlay会被警告的。所以建议使用以下的第二个方法。
具体代码如下:
webView.setWebViewClient(new WebViewClient(){ @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){ handler.proceed(); } });
注:在重写WebViewClient的onReceivedSslError方法时,注意一定要去除onReceivedSslError方法的super.onReceivedSslError(view, handler, error);,否则设置无效。
2、启用mixed content
Android webView 从 Lollipop 开始默认不开MixedContentMode,因此,我们开启即可满足我们大多数需求。
webView.setWebViewClient(new WebViewClient(){ @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webView.getSettings() .setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } });
在Android5.0中,WebView方面做了些修改,如果你的系统target api为21以上:
系统默认禁止了mixed content和第三方cookie。可以使用setMixedContentMode() 和 setAcceptThirdPartyCookies()以分别启用。
系统现在可以智能选择HTML文档的portion来绘制。这种新特性可以减少内存footprint并改进性能。若要一次性渲染整个HTML文档,可以调用这个方法enableSlowWholeDocumentDraw(),如果你的app的target api低于21:系统允许mixed content和第三方cookie,并且总是一次性渲染整个HTML文档。
在使用WebView的类中添加如下代码:
// android 5.0以上默认不支持Mixed Content if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webView.getSettings().setMixedContentMode( WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); }
结果:
我的问题并不是出现在这些地方,而是出现了在加载Url时,部分Url使用的事http而不是https,导致无法加载,功能实现不了。那么要求后台开发人员把http改成https。就这样,成功了。或者还可以使用一些第三方库来加载也行。
测试:
1、调用高德地图没法显示,前端工程师用了http……那么改为https
2、部分功能没实现,因为后台的没有加证书…..那么,全部改回http