Glide加载https图片

来源:互联网 发布:微商代理授权 源码 编辑:程序博客网 时间:2024/05/19 17:07

相关文章:okhttp3.0忽略https证书


在上一节我总结的是用okhttp如何忽略证书来访问https请求,但是访问是可以访问了,但是图片却加载不出来,道理很简单,okhttp我们使用ssl来信任的所有证书,但是glide使用的自己的网络请求来加载的图片,也就是说,想要用glide访问https图片,就必须替换掉glide原始加载图片的方法,使其同样做到信任所有证书。

既然我们已经写好了okhttp信任证书(传送门),不妨就用写好的来替换掉glide的请求方式,替换很简单,只要改一下glide源代码中的几个类就可以,如下创建三个类:


1、OkHttpGlideModule.class

import com.bumptech.glide.Glide;import com.bumptech.glide.GlideBuilder;import com.bumptech.glide.load.model.GlideUrl;import com.bumptech.glide.module.GlideModule;import java.io.InputStream;import okhttp3.OkHttpClient;public class OkHttpGlideModule implements GlideModule {    @Override    public void applyOptions(Context context, GlideBuilder builder) {    }    @Override    public void registerComponents(Context context, Glide glide) {        OkHttpClient mHttpClient = new OkHttpClient().newBuilder()                .sslSocketFactory(SSLSocketClient.getSSLSocketFactory())                .hostnameVerifier(SSLSocketClient.getHostnameVerifier())                .build();        glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(mHttpClient));    }}

2、OkHttpStreamFetcher.class

import com.bumptech.glide.Priority;import com.bumptech.glide.load.data.DataFetcher;import com.bumptech.glide.load.model.GlideUrl;import com.bumptech.glide.util.ContentLengthInputStream;import java.io.IOException;import java.io.InputStream;import java.util.Map;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;import okhttp3.ResponseBody;public class OkHttpStreamFetcher implements DataFetcher<InputStream> {    private final OkHttpClient client;    private final GlideUrl url;    private InputStream stream;    private ResponseBody responseBody;    public OkHttpStreamFetcher(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) {            }        }        if (responseBody != null) {            responseBody.close();        }    }    @Override    public String getId() {        return url.getCacheKey();    }    @Override    public void cancel() {    }}


3、OkHttpUrlLoader.class

import android.content.Context;import com.bumptech.glide.load.data.DataFetcher;import com.bumptech.glide.load.model.GenericLoaderFactory;import com.bumptech.glide.load.model.GlideUrl;import com.bumptech.glide.load.model.ModelLoader;import com.bumptech.glide.load.model.ModelLoaderFactory;import java.io.InputStream;import okhttp3.OkHttpClient;public class OkHttpUrlLoader implements ModelLoader<GlideUrl, InputStream> {    public static class Factory implements ModelLoaderFactory<GlideUrl, InputStream> {        private static volatile OkHttpClient internalClient;        private OkHttpClient client;        private static OkHttpClient getInternalClient() {            if (internalClient == null) {                synchronized (Factory.class) {                    if (internalClient == null) {                        internalClient = new OkHttpClient();                    }                }            }            return internalClient;        }        public Factory() {            this(getInternalClient());        }        public Factory(OkHttpClient client) {            this.client = client;        }        @Override        public ModelLoader<GlideUrl, InputStream> build(Context context, GenericLoaderFactory factories) {            return new OkHttpUrlLoader(client);        }        @Override        public void teardown() {        }    }    private final OkHttpClient client;    public OkHttpUrlLoader(OkHttpClient client) {        this.client = client;    }    @Override    public DataFetcher<InputStream> getResourceFetcher(GlideUrl model, int width, int height) {        return new OkHttpStreamFetcher(client, model);    }}

4、配置使用GlideModule

在AndroidManifest中application标签下声明使用GlideMoudle




注意:在OkHttpGlideModule中可以看到我们重新构建了一个okhttp并注册到了glide中:

SSLSocketClient类在上一篇文章中有说明(传送门),我们通过GlideMoudle这个类来修改了glide原始的网络请求,使用okhttp忽略的https证书。

上述的三个类,有兴趣的可以问度娘,glide的功能强大到我只能望而却步了!