1. 程式人生 > >封裝UniversalImageLoader框架實現一行程式碼即可載入圖片,且完美支援https圖片請求

封裝UniversalImageLoader框架實現一行程式碼即可載入圖片,且完美支援https圖片請求

最近由於蘋果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'
如果不清楚那個資料夾  可以參考下圖


第二部:

建立一個

AuthImageDownLoader的類  繼承BaseImagerDownLoader 並實現它的兩個構造方法  

不清楚的可以看下圖:


(圖片中有些程式碼顯示不全 不要著急  最後我會把全部程式碼  貼上)

第三部:封裝ImageLoaderManager


第四部:

如何使用

單例模式獲取ImageLoaderManager物件 呼叫displayImage(imageview,url)方法  傳入要顯示圖片的View控制元件和圖片地址  就可以啦

可以參考下圖


好的  下面貼上上面用到的程式碼,可以直接把下面的程式碼複製貼上到你的專案裡  可以直接使用

第一個類  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 附上你的名字 就可以通過了