You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Glide V4.5.0加载HTTPS图片遇异常求助

解决Glide 4.5.0加载HTTPS图片的双重异常问题

我明白你折腾了很久,之前V3的方案在4.5.0里确实不适用了,咱们针对这两个异常逐个解决:

一、处理SSLHandshakeException(证书信任锚找不到)

这个问题是因为你的服务器证书不被Android系统默认信任(比如自签名证书),Glide 4.x需要通过集成OkHttp来自定义证书信任逻辑,步骤如下:

  1. 添加OkHttp集成依赖
    在你的build.gradle(Module级别)里加入Glide的OkHttp3集成库,版本要和Glide一致:
implementation 'com.github.bumptech.glide:okhttp3-integration:4.5.0'
  1. 自定义信任证书的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,不过这个风险很高,只适合调试。

  1. 替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:56:27