最近由于苹果app要求ios应用网络请求必须使用https,于是公司后端把所有的http接口改为https请求,关于数据的请求   网上也有很多的文章 看文章基本可以实现让自己的app支持https  但是由于我的图片加载是使用的第三方UniversilImageLoader  图片加载框架  在请求https网络图片时  出现了java.security.cert.CertPathValidatorException: 

Trust anchor for certification path not found 的异常 导致图片不能加载显示,网上也查了一些资料  这方面的比较少  有一篇文章有讲到 但是比较零散  我在这里大家综合整理了一下 图文并茂 可以让你花很少的时间和精力,快速集成到自己的项目中,到了废话到此结束,上菜喽!!

第一步 在AndroidStudio中 集成UniversilImageLoader  只需一行代码  把下面的一行代码复制粘贴到你的build.gradle文件夹里 就可以了

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
如果不清楚那个文件夹  可以参考下图

封装UniversalImageLoader框架实现一行代码即可加载图片,且完美支持https图片请求


第二部:

创建一个

AuthImageDownLoader的类  继承BaseImagerDownLoader 并实现它的两个构造方法  

不清楚的可以看下图:


封装UniversalImageLoader框架实现一行代码即可加载图片,且完美支持https图片请求


(图片中有些代码显示不全 不要着急  最后我会把全部代码  贴上)


第三部:封装ImageLoaderManager



封装UniversalImageLoader框架实现一行代码即可加载图片,且完美支持https图片请求


第四部:

如何使用

单例模式获取ImageLoaderManager对象 调用displayImage(imageview,url)方法  传入要显示图片的View控件和图片地址  就可以啦

可以参考下图


封装UniversalImageLoader框架实现一行代码即可加载图片,且完美支持https图片请求



好的  下面贴上上面用到的代码,可以直接把下面的代码复制粘贴到你的项目里  可以直接使用


第一个类  AuthImageDownloader.java


package com.sunking.mockingbot.Utils;

import android.content.Context;

import com.nostra13.universalimageloader.core.download.BaseImageDownloader;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;

/**
 * 使universityimageloder图片加载框架 支持https图片
 * Created by ITBOY on 2017/6/26 0026.
 */

public class AuthImageDownloader extends BaseImageDownloader {


    private SSLSocketFactory mSSLSocketFactory;

    public AuthImageDownloader(Context context) {
        super(context);
        SSLContext sslContext = sslContextForTrustedCertificates();
        mSSLSocketFactory = sslContext.getSocketFactory();

    }


    public AuthImageDownloader(Context context, int connectTimeout, int readTimeout) {
        super(context, connectTimeout, readTimeout);
        SSLContext sslContext = sslContextForTrustedCertificates();
        mSSLSocketFactory = sslContext.getSocketFactory();
    }

    @Override
    protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
        URL url = null;
        try {
            url = new URL(imageUri);
        } catch (MalformedURLException e) {
        }
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(connectTimeout);
        conn.setReadTimeout(readTimeout);

        if (conn instanceof HttpsURLConnection) {
            ((HttpsURLConnection)conn).setSSLSocketFactory(mSSLSocketFactory);
            ((HttpsURLConnection)conn).setHostnameVerifier((DO_NOT_VERIFY));
        }
        return new BufferedInputStream(conn.getInputStream(), BUFFER_SIZE);
    }
    // always verify the host - dont check for certificate
    final HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };



    public SSLContext sslContextForTrustedCertificates() {
        javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
        javax.net.ssl.TrustManager tm = new miTM();
        trustAllCerts[0] = tm;
        SSLContext sc = null;
        try {
            sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, null);
            //javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }catch (KeyManagementException e) {
            e.printStackTrace();
        }finally {
            return sc;
        }
    }


    class miTM implements javax.net.ssl.TrustManager,
            javax.net.ssl.X509TrustManager {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public boolean isServerTrusted(
                java.security.cert.X509Certificate[] certs) {
            return true;
        }
        public boolean isClientTrusted(
                java.security.cert.X509Certificate[] certs) {
            return true;
        }
        public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs, String authType)
                throws java.security.cert.CertificateException {
            return;
        }
        public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs, String authType)
                throws java.security.cert.CertificateException {
            return;
        }
    }

}


第二个类 ImageLoaderManager.java


package com.sunking.mockingbot.Utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.sunking.mockingbot.R;
/**
 * @author: itboy
 * @function: 初始化UniverImageLoader, 并用来加载网络图片
 * @date: 17/6/13
 */
public class ImageLoaderManager {

    private static final int THREAD_COUNT = 4;
    private static final int PRIORITY = 2;
    private static final int MEMORY_CACHE_SIZE = 2 * 1024 * 1024;
    private static final int DISK_CACHE_SIZE = 50 * 1024 * 1024;
    private static final int CONNECTION_TIME_OUT = 5 * 1000;
    private static final int READ_TIME_OUT = 30 * 1000;
    private static ImageLoaderManager mInstance = null;
    private static ImageLoader mLoader = null;
    public static ImageLoaderManager getInstance(Context context) {
        if (mInstance == null) {
            synchronized (ImageLoaderManager.class) {
                if (mInstance == null) {
                    mInstance = new ImageLoaderManager(context);
                }
            }
        }
        return mInstance;
    }
    /**
     * 私有构造方法完成初始化工作
     *
     * @param context
     */
    private ImageLoaderManager(Context context) {

        ImageLoaderConfiguration config = new ImageLoaderConfiguration
            .Builder(context)
            .threadPoolSize(THREAD_COUNT)
            .threadPriority(Thread.NORM_PRIORITY - PRIORITY)
            .denyCacheImageMultipleSizesInMemory()
            //.memoryCache(new UsingFreqLimitedMemoryCache(MEMORY_CACHE_SIZE))
            .memoryCache(new WeakMemoryCache())
            .diskCacheSize(DISK_CACHE_SIZE)
            .diskCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密
            .tasksProcessingOrder(QueueProcessingType.LIFO)
            .defaultDisplayImageOptions(getDefaultOptions())
            .imageDownloader(new AuthImageDownloader(context, CONNECTION_TIME_OUT, READ_TIME_OUT))
            .writeDebugLogs()
            .build();
        ImageLoader.getInstance().init(config);
        mLoader = ImageLoader.getInstance();
    }
    //load the image
    public void displayImage(ImageView imageView, String path, ImageLoadingListener listener) {
        if (mLoader != null) {
            mLoader.displayImage(path, imageView, listener);
        }
    }

    public void displayImage(ImageView imageView, String path) {
        displayImage(imageView, path, null);
    }

    /**
     * 默认的图片显示Options,可设置图片的缓存策略,编解码方式等,非常重要
     * @return
     */
    private DisplayImageOptions getDefaultOptions() {

        DisplayImageOptions options = new
            DisplayImageOptions.Builder()
            .showImageForEmptyUri(R.drawable.icon_home_no_slideshow)//图片地址为空时加载
            .showImageOnFail(R.drawable.icon_home_no_slideshow)//加载图片失败时加载
            .cacheInMemory(true)//设置下载的图片是否缓存在内存中, 重要,否则图片不会缓存到内存中
            .cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中, 重要,否则图片不会缓存到硬盘中
            .considerExifParams(true)  //是否考虑JPEG图像EXIF参数(旋转,翻转)
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//设置图片以如何的编码方式显示
            .bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//
            .decodingOptions(new BitmapFactory.Options())//设置图片的解码配置
            .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位
            .build();
        return options;
    }
}


ok  祝你好运,如有疑问 欢迎加我QQ:672736347  itboy1792 附上你的名字 就可以通过了



相关文章: