详解android用webview加载网页(https和http)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详解android⽤webview加载⽹页(https和http)
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,.http.SslError) -> onReceivedSslError
所以还要必要在混淆⽂件proguard.cfg中,加⼊以下:
-keep public class .http.SslError
-dontwarn android.webkit.WebView
-dontwarn .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混合内容的问题。
was loaded over HTTPS, but requested an insecure image。
So,该怎么解决呢?很简单,只需设置webSettings,允许其加载混合⽹络协议内容即可。
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。