Glide加载https图片
因为在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到2017年1月1日 App Store中的所有应用都必须启用App Transport Security安全功能,所以受之牵连,因此图片加载框架也要兼容https接口。1、在build.gradle中添加依赖:
compile 'com.github.bumptech.glide:glide:3.6.1'compile 'com.squareup.okhttp:okhttp:2.7.2'compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'
2.拷贝'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'里面3个类OkHttpGlideModule ,OkHttpUrlLoader,OkHttpStreamFetcher的源码;OkHttpGlideModule类:改写成如下忽略证书,支持https
public class OkHttpGlideModule implements GlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {// Do nothing.}@Overridepublic void registerComponents(Context context, Glide glide) {OkHttpClient okHttpClient=new OkHttpClient();X509TrustManager xtm = new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) {}@Overridepublic X509Certificate[] getAcceptedIssuers() {X509Certificate[] x509Certificates = new X509Certificate[0];return x509Certificates;}};SSLContext sslContext = null;try {sslContext = SSLContext.getInstance("SSL");sslContext.init(null, new TrustManager[]{xtm}, new SecureRandom());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (KeyManagementException e) {e.printStackTrace();}HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}};okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());okHttpClient.setHostnameVerifier(DO_NOT_VERIFY);glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));}
}
OkHttpStreamFetcher类
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;}@Overridepublic 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;}@Overridepublic void cleanup() {if (stream != null) {try {stream.close();} catch (IOException e) {// Ignored}}if (responseBody != null) {try {responseBody.close();} catch (IOException e) {// Ignored.}}}@Overridepublic String getId() {return url.getCacheKey();}@Overridepublic void cancel() {// TODO: call cancel on the client when this method is called on a background thread. See #257}
}
OkHttpUrlLoader 类
public class OkHttpUrlLoader implements ModelLoader<GlideUrl, InputStream> {/*** The default factory for {@link OkHttpUrlLoader}s.*/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;}/*** 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(OkHttpClient client) {this.client = client;}@Overridepublic ModelLoader<GlideUrl, InputStream> build(Context context, GenericLoaderFactory factories) {return new OkHttpUrlLoader(client);}@Overridepublic void teardown() {// Do nothing, this instance doesn't own the client.}}private final OkHttpClient client;public OkHttpUrlLoader(OkHttpClient client) {this.client = client;}@Overridepublic DataFetcher<InputStream> getResourceFetcher(GlideUrl model, int width, int height) {return new OkHttpStreamFetcher(client, model);}
}
3、删除在build.gradle中依赖:
compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar';
4、在Android.Manifest中配置:
<meta-dataandroid:name="***.OkHttpGlideModule" android:value="GlideModule" />
此时,重新运行后发现可以加载https啦。
但是,在发布后会出现找不到OkHttpGlideModule类。是因为被混淆了,因此发布时还得注意下
5、发布时避免混淆
在混淆文件proguard-rules.pro中添加混淆规则
-keep class cn.manmanda.util.https_glide.OkHttpGlideModule
Glide加载https图片相关推荐
- Android中Glide加载Https图片失败的解决方案(记录)
1.在Application中添加如下方法: public static void handleSSLHandshake() {try {TrustManager[] trustAllCerts = ...
- 使用Glide加载https网址图片
最近有网友问我怎么加载https图片,说是从网上找了很多办法都没成功,然后我就问他用的是什么图片加载工具,回答是glide,然后我自己也去网上找了一下,千篇一律的都说是结合okhttp来使用,修改 ...
- Glide如何加载https图片(简明操作)
Glide如何加载https图片(简明操作) 利用以下简明步骤可以快速完成Glide加载https图片 - gradle引用 compile 'com.squareup.okhttp3:okhttp: ...
- 成功解决Glide3.7.0加载https图片,显示占位图问题。
平时我们使用Glide加载http网址的图片的时候,图片可以正常加载出来,但是如果服务器端加上了安全认证,当加载自签名的https图片的时候就会报如下错误(证书路径验证异常). Trust ancho ...
- Android 系统(167)----Glide加载圆角图片的方法
Glide加载圆角图片的方法 现在在市面上很多App的UI设计都会出现圆角图片的显示.Glide本身也提供了圆角图片的加载方式.但是我们在开发中有可能遇到只要顶部展示圆角,或者某一个角是圆角.这样的需 ...
- android圆角glide,Glide加载圆角图片的方法
原标题:Glide加载圆角图片的方法 现在在市面上很多App的UI设计都会出现圆角图片的显示.Glide本身也提供了圆角图片的加载方式.但是我们在开发中有可能遇到只要顶部展示圆角,或者某一个角是圆角. ...
- Glide加载部分图片不显示问题
Glide版本为4及其以上 图片不显示原因 没有添加INTERNET网络权限 老版本Glide无法加载https图片(需要使用okhttp忽略证书) 图片Url无法连接 图片返回数据不全且格式不正确 ...
- Android Glide 加载圆形图片(绝对实用)
1.导入依赖 implementation 'com.github.bumptech.glide:glide:4.6.1' 2.用Glide加载圆形图片 Glide.with(context).loa ...
- 解决ImageLoader加载HTTPS图片证书校验异常问题
解决ImageLoader加载HTTPS图片证书校验异常问题 参考文章: (1)解决ImageLoader加载HTTPS图片证书校验异常问题 (2)https://www.cnblogs.com/cs ...
最新文章
- celery 停止执行中 task
- 中国队刷新知识图谱“世界杯”,但点开冠军团队一看,我愣住了
- [No000011B]为什么有些程序员悄无声息渡过35岁中年危机?
- 双缝干涉试验为什么恐怖?
- 类属性和实例属性冲突
- 构造方法与对象的创建 java 1614780813
- ipython的使用
- IDEA报错: Port already in use: 2100
- DeFi借贷协议FLUX和比原链(BTM)达成全面战略合作协议,支持BTM借贷及挖矿
- 一个导入到本地读取文档的方法
- 2019电子科大计算机基础知识,电子科技大学820真题1999-2019终极版.pdf
- 让Cookies操作变得向Session一样简单
- 很好的开源UI框架Chico UI
- R中读取Excel大文件
- 在VMWare中配置SQLServer2005日志传送 Step by Step(二)——配置和测试
- .net byte转java byte_「Java知识收集整理」Java语法的基础
- 制作一个免费的Wi-Fi二维码原来这么简单
- java调用打印机没反应_java代码调用打印机没反应
- java 登陆短信验证码_JAVA短信验证登录
- 存储容量单位GB GiB MB MiB
热门文章
- Mybatis学习-关于Map的应用
- elasticsearch 的高级检索以及 Ik分词器的配置和使用
- ubuntu移植jsoncpp到Android平台
- easypoi 模板导入、导出合并excel单元格功能
- 分析到决策?“AI+BI”这辆车你得尽快搭上
- android 手写签名
- 《数字短片创作(修订版)》——第2章 创造独特的角色、主题和视觉隐喻 创造强有力的人物角色...
- 功夫世界 mysql启动_植物大战僵尸2功夫世界卡在启动中界面问题的解决方法
- ipad pro无线无法连接服务器,ipadappstore无法连接 ipad能上网但appstore无法连接 - 云骑士一键重装系统...
- Unity Shader学习三:坐标空间的变换