详解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,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);

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

您可能感兴趣的文章:

  • Android开发实现ListView点击item改变颜色功能示例
  • Android利用Paint自定义View实现进度条控件方法示例
  • Android实战RecyclerView头部尾部添加方法示例
  • Android中View绘制流程详细介绍
(0)

相关推荐

  • Android利用Paint自定义View实现进度条控件方法示例

    前言 View的三大流程:测量,布局,绘制,自定义View学的是啥?无非就两种:绘制文字和绘制图像. 我们在上一篇文章<Android绘图之Paint的使用>中学习了Paint的基本用法,但是具体的应用我们还没有实践过.从标题中可知,本文是带领读者使用Paint,自定义一个进度条控件. 效果图 上图就是本文要实现的效果图. 实现过程 既然是自定义控件,本文的该控件是直接继承View,然后重写View的onMeasure和onDraw方法来实现.其中onMeasure主要作用是测量控件的宽/高.

  • Android开发实现ListView点击item改变颜色功能示例

    本文实例讲述了Android开发实现ListView点击item改变颜色功能.分享给大家供大家参考,具体如下: 一.先看看效果图: 二.实现步骤: 1. xml布局 <ListView android:id="@+id/left_listview" android:layout_width="match_parent" android:layout_height="match_parent" android:background="

  • Android中View绘制流程详细介绍

    创建Window Window即窗口,这个概念在AndroidFramework中的实现为android.view.Window这个抽象类,这个抽象类是对Android系统中的窗口的抽象.在介绍这个类之前,我们先来看看究竟什么是窗口呢? 实际上,窗口是一个宏观的思想,它是屏幕上用于绘制各种UI元素及响应用户输入事件的一个矩形区域.通常具备以下两个特点: 独立绘制,不与其它界面相互影响: 不会触发其它界面的输入事件: 在Android系统中,窗口是独占一个Surface实例的显示区域,每个窗口的S

  • Android实战RecyclerView头部尾部添加方法示例

    最近开启SDK Manager,突然发现android7.0的都有了,这迭代升级还真快.不过国内普遍手机还是停留在4.4+,多则是是处于5.0版本的.Android5.0变化非常大,引入material design,加强权限管理.减少功耗...好像扯远了0 0.现在直接进入主题.在这里先感谢读者的支持!! ListView是有addHeaderView和 addFooterView两个方法的. 但是作为官方推荐的ListView的升级版RecyclerView缺无法实现这两个方法. 那么如果使

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

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

  • Android中WebView加载网页设置进度条

    本文实例为大家分享了Android中WebView加载网页设置进度条的具体代码,供大家参考,具体内容如下 效果: xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" a

  • 详解Android GLide图片加载常用几种方法

    目录 缓存浅析 GLide图片加载方法 图片加载周期 图片格式(Bitmap,Gif) 缓存 集成网络框架 权限 占位符 淡入效果 变换 启动页/广告页 banner 固定宽高 圆角 圆形 总结 缓存浅析 为啥要做缓存? android默认给每个应用只分配16M的内存,所以如果加载过多的图片,为了 防止内存溢出 ,应该将图片缓存起来. 图片的三级缓存分别是: 1.内存缓存 2.本地缓存 3.网络缓存 其中,内存缓存应优先加载,它速度最快:本地缓存次优先加载,它速度也快:网络缓存不应该优先加载,它

  • 详解Android之图片加载框架Fresco基本使用(二)

    PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,PostProcesser,Image Request 4.渐进式JPEG与动图的显示 最近这两天把Fresco的官方文档算是看了个差不多,就剩下Fresco的基本原理还有结合okHttp等类库如何使用的问题,虽然官方文档给出的功能比较的多,比如说自定义View,缩略图显示等等,这些我也基本就看了个大概,觉

  • 详解Android之图片加载框架Fresco基本使用(一)

    PS:Fresco这个框架出的有一阵子了,也是现在非常火的一款图片加载框架.听说内部实现的挺牛逼的,虽然自己还没研究原理.不过先学了一下基本的功能,感受了一下这个框架的强大之处.本篇只说一下在xml中设置属性的相关用法. 0.引入Fresco以及相关注意事项. 1.PlaceHolderImage占位图 2.FailureImage加载失败时显示的图片 3.RetryImage重新加载的图片 4.ProgressBarImage加载时显示的进度图片 5.BackgroundImage背景图 6.

  • 详解Android Webview加载网页时发送HTTP头信息

    详解Android Webview加载网页时发送HTTP头信息 当你点击一个超链接进行跳转时,WebView会自动将当前地址作为Referer(引荐)发给服务器,因此很多服务器端程序通过是否包含referer来控制盗链,所以有些时候,直接输入一个网络地址,可能有问题,那么怎么解决盗链控制问题呢,其实在webview加载时加入一个referer就可以了,如何添加呢? 从Android 2.2 (也就是API 8)开始,WebView新增加了一个接口方法,就是为了便于我们加载网页时又想发送其他的HT

  • Android中替换WebView加载网页失败时的页面

    我们用webView去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示: 上面这个页面就是系统自带的页面,你觉得是不是很丑?反正小编本人觉得非常丑,很难看,于是乎小编就在想能不能自定义一个页面,当数据请求失败时让系统来加载我们自定义好的页面?上网查了很多资料,都没有关于这个问题的解决方法(反正我是没有找到),经过小编的不断琢磨,今天终于实现了这个功能.以下就是本人自定义实现的数据加载失败时的页面: 这样看起来是不是觉得很高大尚.这和我们真正拿到数据

  • Android使用原生组件WebView加载网页和数据的方法

    在Api中关于这个类的介绍大致就是这是一个可以显示网页的视图,如: webView.loadUrl(http://www.baidu.com/); 显示结果: 还可以加载一些html的字符串,如: String str = "<html><body>You scored <b>192</b> points.</body></html>"; webView.loadData(str, "text/html&

  • android 关于webview 加载h5网页开启定位的方法

    如下所示: //webview定位相关设置 settings.setDomStorageEnabled(true); settings.setGeolocationEnabled(true); //settings.setGeolocationDatabasePath(getFilesDir().getPath()); progressWebView.setWebChromeClient(new WebChromeClient() { @Override public void onGeoloc

  • Android获取WebView加载url的请求错误码 【推荐】

    例如需求,我有一个WebView 加载一个url, 该url对应的网页本身自带下拉刷新 ,但是网页本身会有出现400 500 等异常请求错误码 这时候网页加载失败,页面本身的下拉是无法使用的,要求重新加载页面的话就需要在webview外层套一个android下拉控件(SwipeRefreshLayout) 这样导致下拉一定用的SwipeRefreshLayout的下拉 最终要求是如果页面加载成功的话,用页面本身的下拉,如果页面加载失败的话,用android下拉控件的下拉 ------------

随机推荐