安卓glide加載https圖片

說明:glide加載https圖片失敗萝玷,是因為glide默認http請求。如果想讓它自動加載https圖片,只需要自定義一個GlideModule篇裁,把請求換成帶https請求的就可以了

第一步、定義一個帶https的請求

public class OkHttpsClient {
    public static OkHttpClient OkHttpsClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }
                    }
            };

            // 這里呢是獲取證書(單向或者雙向認證)
            SSLContext sslContext = Xutils.getSSLContext(BestnetApplication.contextApplication);
            if (sslContext == null) {
                sslContext = SSLContext.getInstance("SSL");
                sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            }
            // Create an ssl socket factory with our all-trusting manager
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            // 這個用到了Okhttp3.*
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .sslSocketFactory(sslSocketFactory)
                    .protocols(Arrays.asList(Protocol.HTTP_1_1))
                    .hostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    }).build();
            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

第二步:定義ModelLoader和ModelLoader.Factory

public class OkHttpsUrlLoader implements ModelLoader<GlideUrl, InputStream> {

    /** * The default factory for {@link OkHttpsUrlLoader}s. */
    public static class Factory implements ModelLoaderFactory<GlideUrl, InputStream> {
        private static volatile okhttp3.OkHttpClient internalClient;
        private okhttp3.OkHttpClient client;

        private static okhttp3.OkHttpClient getInternalClient() {
            if (internalClient == null) {
                synchronized (Factory.class) {
                    if (internalClient == null) {
                        internalClient = OkHttpsClient.getUnsafeOkHttpClient();
                    }
                }
            }
            return internalClient;
        }

        /** * Constructor for a new Factory that runs requests using a static singleton client. */
        public Factory() {
            this(getInternalClient());
        }

        /** * Constructor for a new Factory that runs requests using given client. */
        public Factory(okhttp3.OkHttpClient client) {
            this.client = client;
        }

        @Override
        public ModelLoader<GlideUrl, InputStream> build(Context context, GenericLoaderFactory factories) {
            return new OkHttpsUrlLoader(client);
        }

        @Override
        public void teardown() {
            // Do nothing, this instance doesn't own the client.
        }
    }

    private final okhttp3.OkHttpClient client;

    public OkHttpsUrlLoader(okhttp3.OkHttpClient client) {
        this.client = client;
    }
    @Override
    public DataFetcher<InputStream> getResourceFetcher(GlideUrl model, int width, int height) {
        return new OkHttpsStreamFetcher(client, model);
    }
}

第三步赡若、ModelLoader的getResourceFetcher返回一個DataFetcher达布,我們給它傳入一個OkHttpClient實例,讓它通過OkHttpClient發(fā)起請求

public class OkHttpsStreamFetcher implements DataFetcher<InputStream> {
    private final OkHttpClient client;
    private final GlideUrl url;
    private InputStream stream;
    private ResponseBody responseBody;

    public OkHttpsStreamFetcher(OkHttpClient client, GlideUrl url) {
        this.client = client;
        this.url = url;
    }
    @Override
    public InputStream loadData(Priority priority) throws Exception {
        Request.Builder requestBuilder = new Request.Builder()
                .url(url.toStringUrl());

        for (Map.Entry<String, String> headerEntry : url.getHeaders().entrySet()) {
            String key = headerEntry.getKey();
            requestBuilder.addHeader(key, headerEntry.getValue());
        }

        Request request = requestBuilder.build();

        Response response = client.newCall(request).execute();
        responseBody = response.body();
        if (!response.isSuccessful()) {
            throw new IOException("Request failed with code: " + response.code());
        }

        long contentLength = responseBody.contentLength();
        stream = ContentLengthInputStream.obtain(responseBody.byteStream(), contentLength);
        return stream;
    }

    @Override
    public void cleanup() {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (responseBody != null) {
            try {
                responseBody.close();
            } catch (Exception e) {
               e.printStackTrace();
            }
        }
    }

    @Override
    public String getId() {
        return url.getCacheKey();
    }

    @Override
    public void cancel() {

    }
}

第四步逾冬、自定義一個GlideModule黍聂,在OkHttpsGlideModule中進行關(guān)聯(lián)

public class OkHttpsGlideModule implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
    }
    @Override
    public void registerComponents(Context context, Glide glide) {
        glide.register(GlideUrl.class, InputStream.class, new OkHttpsUrlLoader.Factory());
    }
}

第五步、在AndroidManifest.xml中的<application>標(biāo)簽下定義<meta-data>身腻,這樣Glide才能知道我們定義了這么一個類产还,其中android:name是我們自定義的GlideModule的完整路徑,而android:value就固定寫死GlideModule嘀趟。注冊后glide就可以自動加載https圖片了脐区。

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.example.mian.OkHttpsGlideModule"
            android:value="GlideModule"/>
    </application>

引用的架包:

compile 'com.github.bumptech.glide:glide:3.7.0'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市她按,隨后出現(xiàn)的幾起案子牛隅,更是在濱河造成了極大的恐慌,老刑警劉巖酌泰,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒佣,死亡現(xiàn)場離奇詭異,居然都是意外死亡陵刹,警方通過查閱死者的電腦和手機丈攒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巡验,你說我怎么就攤上這事际插。” “怎么了显设?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵框弛,是天一觀的道長。 經(jīng)常有香客問我捕捂,道長瑟枫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任指攒,我火速辦了婚禮慷妙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘允悦。我一直安慰自己膝擂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布隙弛。 她就那樣靜靜地躺著架馋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪全闷。 梳的紋絲不亂的頭發(fā)上叉寂,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音总珠,去河邊找鬼屏鳍。 笑死,一個胖子當(dāng)著我的面吹牛局服,可吹牛的內(nèi)容都是我干的钓瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼腌逢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了超埋?” 一聲冷哼從身側(cè)響起搏讶,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霍殴,沒想到半個月后媒惕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡来庭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年妒蔚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡肴盏,死狀恐怖科盛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菜皂,我是刑警寧澤贞绵,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站恍飘,受9級特大地震影響榨崩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜章母,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一母蛛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乳怎,春花似錦彩郊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椿胯,卻和暖如春筷登,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哩盲。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工前方, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人廉油。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓惠险,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抒线。 傳聞我的和親對象是個殘疾皇子班巩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350