添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
道上混的紫菜汤  ·  Android ...·  8 小时前    · 
深沉的刺猬  ·  Android ...·  8 小时前    · 
迷茫的海龟  ·  安卓端 ...·  8 小时前    · 
开心的刺猬  ·  Android ...·  8 小时前    · 
睡不着的荒野  ·  _泰山FC官方网站·  2 周前    · 
风流的板凳  ·  Java 回调 lua function ...·  3 周前    · 
有胆有识的键盘  ·  COG(Cloud Optimized ...·  2 月前    · 
您现在的位置: 365建站网 > 365文章 > 解决android开发中webview加载https出现空白页问题的方法

解决android开发中webview加载https出现空白页问题的方法

文章来源:365jz.com     点击数: 2658 更新时间:2018-02-01 22:20 参与评论
由于公司项目换成的https接口,其他数据都能加载正常,而webview加载https页面出现空白页,查看logcat:

This request has been blocked; the content must be served over HTTPS

当load有ssl层的https页面时,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页,而并不会像PC浏览器中那样跳出一个风险提示框。因此,我们必须针对这种情况进行处理。(这个证书限于2.1版本以上的Android 系统才可以)

解决android开发中webview加载https出现空白页问题的方法:

webView.setWebViewClient(new WebViewClient(){

@Override

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){

//注意:super句话一定要删除,或者注释掉,否则又走handler.cancel()默认的不支持https的了。

//super.onReceivedSslError(view, handler, error);

//handler.cancel(); // Android默认的处理方式

//handler.handleMessage(Message msg); // 进行其他处理

handler.proceed(); // 接受所有网站的证书

但是在6.0的手机上依然是显示空白页, 很简单,只需设置webSettings,允许其加载混合网络协议内容即可。

解决办法:添加如下代码

*  Webview在安卓5.0之前默认允许其加载混合网络协议内容

*  在安卓5.0之后,默认不允许加载http与https混合内容,需要设置webview允许其加载混合网络协议内容

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);

另外一种说明文档,转载如下:

1.Android 加载https请求的网页的时候 打不开
当load有ssl层的https页面时,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页,而并不会像PC浏览器中那样跳出一个风险提示框。因此,我们必须针对这种情况进行处理。(这个证书限于2.1版本以上的Android 系统才可以)
wv.setWebViewClient(new WebViewClient(){

@override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){

//handler.cancel(); 默认的处理方式,WebView变成空白页
handler.process();接受证书

//handleMessage(Message msg); 其他处理
// 这行代码一定加上否则效果不会出现
webView.getSettings().setJavaScriptEnabled(true);


查看Android浏览器源码在TabControl.Java类中SubWindowClient方法中找,如果只是简单的接受所有证书的话,就直接调process()方法就行了
写到这里之后,直接运行是页面是可以打开的。但是打好签名包之后,依旧打不开!!!
一路追踪之后,发现是那个方法被混淆了
proguard:mapping.txt
xx.xx.xxx
xx.xx.xxx this$0 -> a
void onReceivedSslError(android.webkit.WebView,android.webkit.SslErrorHandler,android.net.http.SslError) -> onReceivedSslError

所以还要必要在混淆文件proguard.cfg中,加入以下:
-keep public class android.net.http.SslError

-dontwarn android.webkit.WebView
-dontwarn android.net.http.SslError
-dontwarn Android.webkit.WebViewClient

还有一点要提到的是,如果手机添加了代理。也是打不开的

但是sslerror是从2.2才开始提供的。之前的版本怎么办?
可以把android2.2中onReceivedSslError()的源码导入到自己的工程中,具体方法如下:
先把android2.2包中的SslError.java和WebViewClient.java导入到自己的工程中,在导入时需要建立和android2.2源码包中一样的包名。然后在用webview的时候导包就导自己工程里的这个包名就行!
注意一下 webView 要设置的几个地方兴许能帮上忙:
1 . 默认情况下,不能访问 https,需要重写 WebViewClient 的 onReceivedSslError
ps: API Level > 2.1,或者提供 SslError.java 和 WebViewClient.java 文件
重写部分一般可以不做特殊处理,直接 handler.process(); 接受证书即可

2 . 默认情况下,不能弹 js 框,需要重写 WebChromeClient 的 onJsAlert
重写部分也不需要特殊处理,直接返回 super.onJsAlert(view, url, message, result);

pps: 要 setWebViewClient 和 setWebChromeClient,webView 才能生效


2.Android 用webview加载网页 可能会出现另外一种情况:
webview加载的网页是http请求的 ,如果网页里有一张图片,并且该图片的地址是https请求的,这时候用webview加载网页,图片是不显示的。
会报这种错
Mixed Content as loaded over HTTPS, but requested an insecure image
意思是  http请求和https请求混淆了
注意: 用webview加载网页,一定用同一种请求