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() { }}
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的功能强大到我只能望而却步了!
阅读全文
0 0
- Glide加载https图片
- Glide加载https图片
- Glide加载https图片
- Glide加载https图片
- Glide加载自签名的https图片
- 使用Glide加载https网址图片
- Glide如何加载https图片(简明操作)
- Glide图片库基本用法及加载认证的https图片
- Glide加载自签名认证的https图片
- 图片加载库Glide
- Android Glide 图片加载
- Glide加载图片
- 图片加载库Glide
- 图片加载库Glide
- 图片加载框架Glide
- Glide图片加载
- Glide图片加载
- Glide 加载图片变形
- 推导基姆拉尔森公式根据日期计算星期
- SpringBoot入门
- Zookeeper实例ZkClient API-创建节点
- 下载POI信息点(学校、医院、银行、餐饮等等)
- Kotlin学习途径
- Glide加载https图片
- Android Studio之Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled解决办法
- 第四章SpringMVC--Controller接口控制器详解 (4)
- NTT(快速数论变换)模板
- 如何提高UI设计效率
- 17. Letter Combinations of a Phone Number
- Eclipse中安装反编译
- 安卓学习笔记 6-14 排序
- 使用FaceNet进行人脸检测