使用Glide Android OS 4(棒棒糖前版本)在Imageview中加载https url

使用Glide Android OS 4(棒棒糖前版本)在Imageview中加载https url,android,https,imageview,ssl-certificate,android-glide,Android,Https,Imageview,Ssl Certificate,Android Glide,我正在使用Glide在imageview中加载图像 Glide.with(getApplicationInstance()).load(imageUrl).placeholder(R.drawable.no_image).error(R.drawable.no_image).diskCacheStrategy(DiskCacheStrategy.RESOURCE).into(imgView); 它适用于http图像,但不适用于Android OS 4,5中的https。 图像URL使用SSL

我正在使用Glide在imageview中加载图像

 Glide.with(getApplicationInstance()).load(imageUrl).placeholder(R.drawable.no_image).error(R.drawable.no_image).diskCacheStrategy(DiskCacheStrategy.RESOURCE).into(imgView);
它适用于http图像,但不适用于Android OS 4,5中的https。 图像URL使用SSL自签名证书。并且它不在imageview中加载

 Glide.with(getApplicationInstance()).load(imageUrl).placeholder(R.drawable.no_image).error(R.drawable.no_image).diskCacheStrategy(DiskCacheStrategy.RESOURCE).into(imgView);
从滑动侦听器错误:

javax.net.ssl.SSLHandshakeException(java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.)
     call GlideException#logRootCauses(String) for more detail
我已尝试从中添加GlideModule 结果:应用程序未显示该屏幕。我无法找到这次崩溃的日志,因为它运行得很快

我使用了下面的GlideModule,但仍然不适用于Android Prerollipop版本

@GlideModule
public class KioskGlideModule extends AppGlideModule {

@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
    super.registerComponents(context, glide, registry);

    OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder();

    enableTls12OnPreLollipop(okHttpClient);

    registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient.build()));
}

@Override
public boolean isManifestParsingEnabled() {
    return false;
}

public static OkHttpClient.Builder enableTls12OnPreLollipop(OkHttpClient.Builder client) {
    if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) {

        TrustManagerFactory tmf = null;
        // Create a KeyStore containing our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore trustedKeyStore = null;
        try {
            trustedKeyStore = KeyStore.getInstance(keyStoreType);
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        try {
            trustedKeyStore.load(null, null);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        }
        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        try {
            tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        try {
            tmf.init(trustedKeyStore);
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }

        try {
            SSLContext sc = SSLContext.getInstance("TLSv1.2");
            sc.init(null, null, null);
            client.sslSocketFactory(new TlS12SocketFactory(), (X509TrustManager) (tmf.getTrustManagers()[0]));

            ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                    .tlsVersions(TlsVersion.TLS_1_2)
                    .build();

            List<ConnectionSpec> specs = new ArrayList<>();
            specs.add(cs);
            specs.add(ConnectionSpec.COMPATIBLE_TLS);
            specs.add(ConnectionSpec.CLEARTEXT);

            client.connectionSpecs(specs);
        } catch (Exception exc) {
            Log.e("OkHttpTLSCompat", "Error while setting TLS 1.2", exc);
        }
    }

    return client;
}
@GlideModule
公共类KioskGlideModule扩展了AppGlideModule{
@凌驾
公共无效注册表组件(@NonNull上下文、@NonNull Glide Glide、@NonNull注册表){
超级注册表组件(上下文、滑动、注册表);
OkHttpClient.Builder OkHttpClient=新的OkHttpClient.Builder();
启用TLS12OnPerollipop(okHttpClient);
replace(GlideUrl.class、InputStream.class、新的OkHttpUrlLoader.Factory(okHttpClient.build());
}
@凌驾
公共布尔IsManifestParsingabled(){
返回false;
}
公共静态OkHttpClient.Builder启用TLS12ONPLELOLLIPOP(OkHttpClient.Builder客户端){
if(Build.VERSION.SDK_INT>=16&&Build.VERSION.SDK_INT<22){
TrustManagerFactory tmf=null;
//创建包含可信CA的密钥库
字符串keyStoreType=KeyStore.getDefaultType();
KeyStore trustedKeyStore=null;
试一试{
trustedKeyStore=KeyStore.getInstance(keyStoreType);
}捕获(KeyStoreException e){
e、 printStackTrace();
}
试一试{
load(null,null);
}捕获(IOE异常){
e、 printStackTrace();
}捕获(无算法异常){
e、 printStackTrace();
}捕获(证书例外e){
e、 printStackTrace();
}
//创建信任密钥库中CA的信任管理器
字符串tmfAlgorithm=TrustManagerFactory.getDefaultAlgorithm();
试一试{
tmf=TrustManagerFactory.getInstance(tmfAlgorithm);
}捕获(无算法异常){
e、 printStackTrace();
}
试一试{
tmf.init(trustedKeyStore);
}捕获(KeyStoreException e){
e、 printStackTrace();
}
试一试{
SSLContext sc=SSLContext.getInstance(“TLSv1.2”);
sc.init(null,null,null);
client.sslSocketFactory(新的TlS12SocketFactory(),(X509TrustManager)(tmf.getTrustManagers()[0]);
ConnectionSpec cs=新的ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.TlsVersion(TlsVersion.TLS_1_2)
.build();
列表规格=新的ArrayList();
增加规格(cs);
规格添加(连接规格兼容);
规范添加(连接规范明文);
客户连接规范(规范);
}捕获(异常exc){
Log.e(“OkHttpTLSCompat”,“设置TLS 1.2时出错”,exc);
}
}
返回客户;
}
}


帮助解决这个问题。提前谢谢

创建ur Uri.buildOn().scheme(“https”)。buildIt还应与
https
一起工作。在加载调用中附加一个侦听器,并检查是否出现任何错误或异常。也是
imgView
是一个基本的
ImageView
或一些自定义的
ImageView
@ADM,它是普通的ImageView。我的https url已签署证书,因此无法加载。您是否已根据@Sandy中提到的答案在清单中添加元数据添加元数据在添加元数据后,应用程序不会重定向到该屏幕并崩溃。我也无法获取日志。