封裝UniversalImageLoader框架實現一行程式碼即可載入圖片,且完美支援https圖片請求
阿新 • • 發佈:2019-01-22
最近由於蘋果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 附上你的名字 就可以通過了