Android中WebView加载带有ssl层的https页面

来源:互联网 发布:海岛大亨5mac版汉化 编辑:程序博客网 时间:2024/06/09 17:39

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

Android的处理要用到两个类
(1)import android.NET.http.SslError;

(2)import android.webkit.SslErrorHandler;
 
注:别忘记在在manifest里面授权
具体处理如下:
webView.setWebViewClient(new WebViewClient() {public void onReceivedSslError(WebView view,SslErrorHandler handler, SslError error) {//   //handler.cancel(); 默认的处理方式,WebView变成空白页handler.proceed(); // 接受证书// handleMessage(Message msg); 其他处理}});// 这两行代码一定加上否则效果不会出现webView.getSettings().setJavaScriptEnabled(true);webView.getSettings().setDefaultTextEncodingName("gb2312");webView.loadUrl(<a target=_blank href="https://xxxxxxxx">https://xxxxxxxx</a>);

 

查看Android浏览器源码在TabControl.Java类中SubWindowClient方法中找,如果只是简单的接受所有证书的话,就直接调process()方法就行了

 

但是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 才能生效


 

0 0
原创粉丝点击