欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详解android 用webview加载网页(https和http)

程序员文章站 2023-11-13 13:30:04
1.android 加载https请求的网页的时候 打不开 当load有ssl层的https页面时,如果这个网站的安全证书在android无法得到认证,webview...

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加载网页,一定用同一种请求

android 5.0 webview不能加载http与https混合内容的问题

在android lollipop上webview默认不允许加载http与https混合内容,比如你访问的网页为http://xxx.com/a.html,则如果a.html包含了https的res,则此res不会显示。如果仔细观察log,可以看到如下的内容提示:

。。。。。。was loaded over https, but requested an insecure image。。。。。。。。。。

so,该怎么解决呢?很简单,只需设置websettings,允许其加载混合网络协议内容即可。

websettings.setmixedcontentmode(websettings.mixed_content_always_allow);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。