解决ImageLoader加载HTTPS图片证书校验异常问题

在某个项目开发过程中发现使用Universal-Image-Loader无法加载Https图片资源,查看日志发现原来是证书校验失败。

查看源码发现,ImageLoader中可以通过继承BaseImageDownloader重写下载部分逻辑,实现如下

 1 public class AuthImageDownloader extends BaseImageDownloader {
 2
 3     public static final String TAG = AuthImageDownloader.class.getName();
 4
 5     /**
 6      * {@value}
 7      */
 8     public static final int DEFAULT_HTTP_CONNECT_TIMEOUT = 5 * 1000; // milliseconds
 9     /**
10      * {@value}
11      */
12     public static final int DEFAULT_HTTP_READ_TIMEOUT = 20 * 1000; // milliseconds
13
14     public AuthImageDownloader(Context context) {
15         this(context, DEFAULT_HTTP_CONNECT_TIMEOUT, DEFAULT_HTTP_READ_TIMEOUT);
16     }
17
18     public AuthImageDownloader(Context context, int connectTimeout, int readTimeout) {
19         super(context, connectTimeout, readTimeout);
20     }
21
22     @Override
23     protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
24
25         URL url = null;
26         try {
27             url = new URL(imageUri);
28         } catch (MalformedURLException e) {
29             Log.e(TAG, e.getMessage(), e);
30         }
31         HttpURLConnection http = null;
32
33         if (Scheme.ofUri(imageUri) == Scheme.HTTPS) {
34             trustAllHosts();
35             HttpsURLConnection https = (HttpsURLConnection) url
36                     .openConnection();
37             https.setHostnameVerifier(DO_NOT_VERIFY);
38             http = https;
39             http.connect();
40         } else {
41             http = (HttpURLConnection) url.openConnection();
42         }
43
44         http.setConnectTimeout(connectTimeout);
45         http.setReadTimeout(readTimeout);
46         return new FlushedInputStream(new BufferedInputStream(
47                 http.getInputStream()));
48     }
49
50     // always verify the host - dont check for certificate
51     final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
52         @Override
53         public boolean verify(String hostname, SSLSession session) {
54             return true;
55         }
56     };
57
58     /**
59      * Trust every server - dont check for any certificate
60      */
61     private static void trustAllHosts() {
62         // Create a trust manager that does not validate certificate chains
63         TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
64             @Override
65             public void checkClientTrusted(
66                     java.security.cert.X509Certificate[] x509Certificates,
67                     String s) throws java.security.cert.CertificateException {
68             }
69
70             @Override
71             public void checkServerTrusted(
72                     java.security.cert.X509Certificate[] x509Certificates,
73                     String s) throws java.security.cert.CertificateException {
74             }
75
76             @Override
77             public java.security.cert.X509Certificate[] getAcceptedIssuers() {
78                 return new java.security.cert.X509Certificate[]{};
79             }
80         }};
81
82         // Install the all-trusting trust manager
83         try {
84             SSLContext sc = SSLContext.getInstance("TLS");
85             sc.init(null, trustAllCerts, new java.security.SecureRandom());
86             HttpsURLConnection
87                     .setDefaultSSLSocketFactory(sc.getSocketFactory());
88         } catch (Exception e) {
89             e.printStackTrace();
90         }
91     }
92 }

然后在ImageLoader中配置

ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(
                context);
...
config.imageDownloader(new AuthImageDownloader(this));

问题解决,ok

时间: 2024-11-09 18:02:54

解决ImageLoader加载HTTPS图片证书校验异常问题的相关文章

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

android ImageLoader加载本地图片的工具类

import android.widget.ImageView; import com.nostra13.universalimageloader.core.ImageLoader; /** * 异步加载本地图片工具类 * * @author tony * */ public class LoadLocalImageUtil { private LoadLocalImageUtil() { } private static LoadLocalImageUtil instance = null;

Android 开源框架Universal-Image-Loader加载https图片

解决方案就是 需要 android https HttpsURLConnection 这个类忽略证书 1,找到 Universal-Image-Loader的library依赖包下面com.nostra13.universalimageloader.core.download下面的BaseImageDownloader这个类 里面的createConnection这个方法,添加如下: 1 protected HttpURLConnection createConnection(String ur

(转)解决Eclipse加载图片或网页出现404错误

(转)解决Eclipse加载图片或网页出现404错误 原文链接如下: https://blog.csdn.net/qq_39893313/java/article/details/82589670 随着网页的数目加多,建文件的个数增多,图片或网页的加载出现404错误 例如 index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UT

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView

ImageLoader加载图片

先导universal-image-loader-1.9.3包 在application配置 android:name=".MyApplication" intent权限 package com.ch.day13_imageloaderdemo; import java.io.File; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;import com.nostra13.univ

BitmapFactory.Options解决Android加载图片内存溢出的问题

BitmapFactory.Options解决Android加载图片内存溢出的问题 1. 在Android软件开发过程中,图片处理是经常遇到的. 在将图片转换成Bitmap的时候,由于图片的大小不一样,当遇到很大的图片的时候会出现超出内存的问题,为了解决这个问题Android API提供了BitmapFactory.Options这个类. 2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出.Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直

WebView加载HTML图片大小自适应与文章自动换行

http://www.brighttj.com/ios/ios-webview-load-html-image-adaptive.html 在很多App中都会使用到webview,尤其是在加载新闻内容等文章形式的数据时.因为图文混编以及不同字体格式的显示,在iOS进行编辑和显示都是一大问题(当然,iOS中也可以用CoreText进行绘制),但是对于web端来说,一个富文本编辑器就可以完美解决这个问题.所以后台很多时候会直接返回HTML代码拿给前端解析,这时,在客户端对HTML代码的处理就显得尤为

TextView加载html图片异步显示(Picasso)

项目中有这样一个需求: textview加载一段 html标签 其中包含 "<Img url= " 图片异步展示 而且 根据图片的比例 宽度满屏展示. 思路: 重写textview Html.fromHtml方法  以及 图片Picasso展示(后面会附带Picasso 的两个转换类) 感觉网上没有合适的或者用的是Gilde加载 其实无论是Gilde还是Picasso加载豆豆都能满足我们的需求. 需求描述完毕 上张帅图: 好吧 废话不多说了 直接上实现代码 RichText: p