使用Glide Android OS 4(棒棒糖前版本)在Imageview中加载https url
我正在使用Glide在imageview中加载图像使用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.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中提到的答案在清单中添加元数据添加元数据在添加元数据后,应用程序不会重定向到该屏幕并崩溃。我也无法获取日志。