WebView 图片加载问题

(最近项目用到了 webview 显示消息内容,根据之前的使用的习惯,这次出现了部分图片加载问题,比较纳闷,同样代码,之前没有问题,这是为毛呢?)

一、认识 WebView

作为 Android 开发都知道在手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装为一个叫做 WebView 的控件。它可以显示和渲染Web页面、直接使用html文件(网络上或本地assets中)作布局、可和JavaScript交互调用(Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome) 。

二、如何使用

1、Webview 类自身的常见方法(最近项目用到了 webview 显示消息内容,根据之前的使用的习惯,这次出现了部分图片加载问题,比较纳闷,同样代码,之前没有问题,这是为毛呢?)
2、Webview 的最常用的工具类:WebSettings 类、WebViewClient 类、WebChromeClient 类
3、Android 和 Js的交互
(webview 是一个比较复杂的控件,在使用中会遇到莫名其妙的问题,这里主要记录下图片加载问题)

以上是对 webview 控件框架做了简要的总结,首先知道了他是一个什么样的控件,其次他的一些属性、方法。现在回到问题,问题出现时候我以为少了一些设置,回到代码看了看:

  mWebview.getSettings().setJavaScriptEnabled(true);//启用js

   mWebview.getSettings().setBlockNetworkImage(false);//解决图片不显示

这两行代码后边注释写的很清楚,我也设置过了,图片怎么还是不显示了?接着后面尝试了其他的方法,加上也是没有用问题依然还在。google 了一把,总算知道了问题原因:从 Android 5.0 开始,WebView 默认不支持同时加载 https 和 http 混合模式。当 webview 加载的链接为 https 开头,但是链接里面的内容,比如图片为 http 链接,这时候图片就会加载不出来,下面根据文档详细分析下:

Android 5.0 以后:

当一个安全的站点(https)去加载一个非安全的站点(http)时,需要配置 webview 加载内容的混合模式,一共有如下三种模式:

MIXED_CONTENT_NEVER_ALLOW:Webview不允许一个安全的站点(https)去加载非安的站点内容(http),比如,https网页内容的图片是http链接。强烈建议App使用这种模式,因为这样更安全。

MIXED_CONTENT_ALWAYS_ALLOW
:在这种模式下,WebView是可以在一个安全的站点(Https)里加载非安全的站点内容(Http),这是WebView最不安全的操作模式,尽可能地不要使用这种模式。

MIXED_CONTENT_COMPATIBILITY_MODE
:在这种模式下,当涉及到混合式内容时,WebView会尝试去兼容最新Web浏览器的风格。一些不安全的内容(Http)能被加载到一个安全的站点上(Https),而其他类型的内容将会被阻塞。这些内容的类型是被允许加载还是被阻塞可能会随着版本的不同而改变,并没有明确的定义。这种模式主要用于在App里面不能控制内容的渲染,但是又希望在一个安全的环境下运行。


总结:

在Android5.0以下,默认是采用的MIXED_CONTENT_ALWAYS_ALLOW模式,即总是允许WebView同时加载Https和Http;而从Android5.0开始,默认用MIXED_CONTENT_NEVER_ALLOW模式,即总是不允许WebView同时加载Https和Http。

解决办法:

我们可以根据系统版本,用代码去设置加载模式为 MIXED_CONTENT_ALWAYS_ALLOW

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}

问题得以解决...webview 坑是很多的,这里记录下这次遇到的坑。。。




你可能感兴趣的:(Android)