Glide V4 如何加载 HTTPS 图片

6

我知道这个链接,尝试过了但是那是适用于Glide V3的解决方案,我需要加载https://myimage/image/xxx.png,但是Glide抛出异常。

FileNotFoundException(No content provider)** and **SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found

我正在使用4.5.0版本的Glide,花了很长时间但仍找不到解决方案,非常感激您的帮助。


这个异常意味着您的myimage服务器具有自签名证书,而不是公共签名证书。下面的答案解释了如何告诉Glide忽略此问题。另一个选项是正确设置https,例如在Web服务器上安装Let's Encrypt或将图像托管在S3或其他良好配置的环境中。 - Barett
3个回答

11

我挣扎了将近一天,但最终找到了解决方案。如果你使用的是 SSL 认证的链接(如 https),那么你需要添加两个 Glide 依赖项。你需要添加以下内容:

implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
implementation 'com.github.bumptech.glide:annotations:4.5.0'
kapt 'com.github.bumptech.glide:compiler:4.5.0'

我正在使用Kotlin,所以我添加了kapt,你可以使用annotationProcessor

之后,您需要在项目中创建GlideModule,这是Glide V4的代码:

 @GlideModule
public class MyGlideModule extends AppGlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        super.applyOptions(context, builder);
    }

    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
        OkHttpClient okHttpClient= UnsafeOkHttpClient.getUnsafeOkHttpClient();
        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));
    }
}

我们在绕过SSL,这里是UnsafeOkHttpClient类。

    public class UnsafeOkHttpClient {


    public static OkHttpClient getUnsafeOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[] {
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 }

之后你需要再加上两个类 OkHttpUrlLoader 和 OkHttpStreamFetcher

你可以从Glide链接中复制粘贴

最后一步是我不知道的,所以需要花费一天时间去构建项目,Glide将生成GlideApp类,因此你需要使用该GlideApp类来显示HTTPS图像,像这样:

GlideApp.with(context).load(url).apply(RequestOptions.circleCropTransform()).into(imageView)

我认为这对于那些正在遭受此类问题的人非常有帮助。保持代码:)


您可能会遇到Play市场验证问题。 - ror
我在使用Glide时遇到了问题:在某些设备上出现了1个原因:java.net.UnknownHostException(host ==“null”),我尝试按照您的答案操作,它起作用了。谢谢。 - Holi Boom
@HuoChhunleng 哦!太好了,这是我的荣幸。 - Mohit Suthar
1
在构建图像请求时,请不要忘记使用GlideApp而不是'Glide'。 - Rick Royd Aban
这是使用Glide从https的url加载图像的最佳解决方案,谢谢。 - Richard Hsieh
一个完美的解决方案。 - Pandiri Deepak

3
Mohit的答案结构良好,但是现在你可以在这里获取所有所需的类。因此,只需添加即可包含它们。请注意保留HTML标记。

implementation "com.github.bumptech.glide:okhttp3-integration:$glideV"

0

这个解决方案对我有效,使用implementation 'com.github.bumptech.glide:glide:4.8.0'

在extends Application中添加

SSLContext mySSLContext = SSLContext.getInstance("TLS");
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
}};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
if (arg0.equalsIgnoreCase("YOUR_DOMAIN OR YOUR IP"))
return true;
else
return false;
}
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接