Glide V4.5.0加载HTTPS图片遇异常求助
解决Glide 4.5.0加载HTTPS图片的双重异常问题
我明白你折腾了很久,之前V3的方案在4.5.0里确实不适用了,咱们针对这两个异常逐个解决:
一、处理SSLHandshakeException(证书信任锚找不到)
这个问题是因为你的服务器证书不被Android系统默认信任(比如自签名证书),Glide 4.x需要通过集成OkHttp来自定义证书信任逻辑,步骤如下:
- 添加OkHttp集成依赖
在你的build.gradle(Module级别)里加入Glide的OkHttp3集成库,版本要和Glide一致:
implementation 'com.github.bumptech.glide:okhttp3-integration:4.5.0'
- 自定义信任证书的OkHttpClient
如果是自签名证书,先把证书文件(比如my_cert.cer)放到res/raw目录,然后创建自定义的OkHttpClient:
// 加载本地证书 InputStream certInputStream = getResources().openRawResource(R.raw.my_cert); CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(certInputStream); // 创建信任管理器 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(null, null); keyStore.setCertificateEntry("ca", cert); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); // 创建SSLContext SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagers, new SecureRandom()); // 构建自定义OkHttpClient OkHttpClient customOkHttpClient = new OkHttpClient.Builder() .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagers[0]) .hostnameVerifier((hostname, session) -> true) // 测试环境可忽略主机名校验,生产环境不建议 .build();
如果只是测试环境想快速跳过证书校验(生产环境绝对禁止),可以用简化版的信任所有证书的TrustManager,不过这个风险很高,只适合调试。
- 替换Glide的HTTP客户端
创建自定义的AppGlideModule(注意要加@GlideModule注解):
import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.module.AppGlideModule; import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader; import com.bumptech.glide.load.model.GlideUrl; import java.io.InputStream; @GlideModule public class MyGlideModule extends AppGlideModule { @Override public void registerComponents(Context context, Glide glide, Registry registry) { // 替换默认的HTTP加载器为自定义的OkHttp加载器 registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(customOkHttpClient)); } }
注意:customOkHttpClient需要是全局可访问的,或者在registerComponents方法里创建。
二、处理FileNotFoundException(No content provider)
这个异常通常和链接格式、Glide的加载策略有关,试试这些排查点:
- 检查URL的正确性:确保
https://myimage/image/xxx.png是可直接访问的,比如用浏览器或者Postman测试,有没有重定向、404的情况。 - 确保网络权限:在
AndroidManifest.xml里确认添加了网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 调整Glide的加载策略:尝试跳过缓存加载,避免缓存的旧数据干扰:
Glide.with(this) .load("https://myimage/image/xxx.png") .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) .into(imageView); - 检查URL编码:如果URL里有特殊字符,需要先进行URL编码,比如用
URLEncoder.encode()处理路径部分。
最后确认Glide 4.x的用法
Glide 4.x和V3的API差异很大,确保你的加载代码是4.x的正确写法,比如用Glide.with(context)获取RequestBuilder,而不是旧的Glide.with()链式调用的老方式。
内容的提问来源于stack exchange,提问作者Mohit Suthar
相关产品推荐
相关产品推荐

