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

作者:码农的小世界 时间:2021-12-29 11:14:30 

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);

来源:http://blog.csdn.net/qq_30740239/article/details/54141106

标签:webview,http,https
0
投稿

猜你喜欢

  • Java基本数据类型与类型转换实例分析

    2021-07-13 14:41:29
  • Spring Security短信验证码实现详解

    2023-07-04 22:27:07
  • Android中ImageView的使用方法

    2023-11-19 02:03:41
  • Java教程各种接口的介绍

    2022-04-29 08:49:25
  • SpringBoot解决Required String parameter xxx is not present问题

    2021-08-08 12:53:15
  • Java编程中的检查型异常与非检查型异常分析

    2023-11-04 13:08:38
  • MyBatis-Plus中最简单的查询操作教程(Lambda)

    2022-03-16 13:43:28
  • C#实现把txt文本数据快速读取到excel中

    2022-10-15 02:59:10
  • 第一次编写Java流布局图形界面

    2023-10-13 08:27:11
  • 深入理解Java设计模式之享元模式

    2023-11-10 17:20:51
  • C++实现幸运大抽奖(QT版)

    2021-09-15 21:32:00
  • Java多维数组和Arrays类方法总结详解

    2022-04-27 22:30:18
  • SpringBoot集成vue的开发解决方案

    2023-11-24 20:58:10
  • Unity UI实现循环播放序列图

    2023-03-14 15:51:10
  • Java中的MapStruct用法详解

    2022-10-05 12:18:13
  • java并发包JUC诞生及详细内容

    2022-04-06 02:57:00
  • Maven引入外部jar的几种方法(小结)

    2022-11-10 01:35:30
  • Druid(新版starter)在SpringBoot下的使用教程

    2021-07-03 20:25:18
  • 使用AOP的@Around后无返回值的解决

    2023-11-24 13:04:09
  • Spring容器初始化及问题解决方案

    2023-09-14 08:19:32
  • asp之家 软件编程 m.aspxhome.com