Glide 未加载一些图片 URL
Glide not loading some Image URL
我正在尝试使用 Glide 加载图像 URL。
错误。
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
我在 google 中搜索了这个错误,它说是 https 问题,但之前我在其他项目中工作,该项目也在 https.it 工作 fine.why https 是问题还是这是其他问题?
图片加载:
Glide.with(context)
.load(bannerImageModel.getOutput().get(position).getBanner_img())
.apply(new RequestOptions().
diskCacheStrategy(DiskCacheStrategy.ALL))
.into(view);
link 1 : https://freshtocook.in/uploads/banner/47a16ffc2fc5935dccd37574083c6201.jpg
link 2 : https://freshtocook.in/uploads/banner/7eecf823e008a0bb93f347d994b6e534.jpg
link 3 : https://freshtocook.in/uploads/banner/62d69dfa30acabbfe60bc77c5f19cc53.jpg
完全错误:
javax.net.ssl.SSLHandshakeException(java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。)
调用 GlideException#logRootCauses(String) 获取更多细节
原因(1 之 1):class com.bumptech.glide.load.engine.GlideException:获取数据失败,class java.io.InputStream,REMOTE
有1个原因:
javax.net.ssl.SSLHandshakeException(java.security.cert.CertPathValidatorException: 未找到证书路径的信任锚。)
调用 GlideException#logRootCauses(String) 获取更多细节
原因(1 之 1):class com.bumptech.glide.load.engine.GlideException:获取失败
有1个原因:
javax.net.ssl.SSLHandshakeException(java.security.cert.CertPathValidatorException: 未找到证书路径的信任锚。)
调用 GlideException#logRootCauses(String) 获取更多细节
原因(1 之 1):class javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。
2020-07-14 18:25:03.367 24169-24169/com.example.freshtocook I/Glide:根本原因(第 1 个,共 1 个)
javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。
在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:239)
在 com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:1471)
在 com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:1415)
在 com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:1359)
在 com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:221)
在 com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144)
在 com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106)
在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400)
在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333)
在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:483)
在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:135)
在 com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90)
在 com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30)
在 com.bumptech.glide.load.data.HttpUrlFetcher.loadDataWithRedirects(HttpUrlFetcher.java:104)
在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:59)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.java:164)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.java:154)
在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:65)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
在 com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:62)
在 com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:309)
在 com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:279)
在 com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:235)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
在 java.lang.Thread.run(Thread.java:919)
在 com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:446)
原因:java.security.cert.CertificateException:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。
在 com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:668)
在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:513)
在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:432)
在 com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:360)
在 android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94)
在 android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:89)
在 com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:224)
在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(ConscryptFileDescriptorSocket.java:430)
在 com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(本机方法)
在 com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:387)
在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:234)
在 com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:1471)
在 com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:1415)
在 com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:1359)
在 com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:221)
在 com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144)
在 com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106)
在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400)
在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333)
在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:483)
在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:135)
在 com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90)
在 com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30)
在 com.bumptech.glide.load.data.HttpUrlFetcher.loadDataWithRedirects(HttpUrlFetcher.java:104)
在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:59)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.java:164)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.java:154)
在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:65)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
在 com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:62)
在 com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:309)
在 com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:279)
在 com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:235)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
在 java.lang.Thread.run(Thread.java:919)
在 com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:446)
原因:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。
在 com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:668)
在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:513)
在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:432)
在 com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:360)
在 android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94)
在 android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:89)
在 com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:224)
在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(ConscryptFileDescriptorSocket.java:430)
在 com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(本机方法)
在 com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:387)
在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:234)
在 com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:1471)
在 com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:1415)
在 com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:1359)
在 com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:221)
在 com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144)
在 com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106)
在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400)
在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333)
在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:483)
在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:135)
在 com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90)
在 com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30)
在 com.bumptech.glide.load.data.HttpUrlFetcher.loadDataWithRedirects(HttpUrlFetcher.java:104)
在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:59)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.java:164)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.java:154)
在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:65)
在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
在 com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:62)
在 com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:309)
在 com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:279)
在 com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:235)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
在 java.lang.Thread.run(Thread.java:919)
在 com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:446)
2020-07-14 18:25:03.457 24169-24705/com.example.freshtocook I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
2020-07-14 18:25:03.458 24169-24705/com.example.freshtocook I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
现在使用 ION 库出现此错误:
/ViewRootImpl: sendUserActionEvent() mView 返回。
2020-07-14 18:46:15.892 7931-8566/com.example.freshtocook E/CONSCRYPT: ------------------不受信任的链: -- ----------------------
2020-07-14 18:46:15.892 7931-8566/com.example.freshtocook E/CONSCRYPT: == Chain0 ==
版本:3
2020-07-14 18:46:15.893 7931-8566/com.example.freshtocook E/CONSCRYPT:AuthorityKeyIdentifier:418301680148d8c5ec454ad8ae177e99bf99b05e1b8018d61e1
2020-07-14 18:46:15.893 7931-8566/com.example.freshtocook E/CONSCRYPT:SubjectKeyIdentifier:416041493ef6a0cb4e08cbdefeb4fca54cd8872b99d23a0
2020-07-14 18:46:15.893 7931-8566/com.example.freshtocook E/CONSCRYPT:序列号:74e9c119b31c8edeb61e2c05de385e5a
2020-07-14 18:46:15.894 7931-8566/com.example.freshtocook E/CONSCRYPT: SubjectDN: CN=freshtocook.in
2020-07-14 18:46:15.895 7931-8566/com.example.freshtocook E/CONSCRYPT:IssuerDN:CN=Sectigo RSA 域验证安全服务器 CA,O=Sectigo Limited,L=Salford,ST=大曼彻斯特,C=GB
2020-07-14 18:46:15.916 7931-8566/com.example.freshtocook E/CONSCRYPT:不早于:Sun May 03 05:30:00 GMT+05:30 2020
2020-07-14 18:46:15.916 7931-8566/com.example.freshtocook E/CONSCRYPT:不晚于:5 月 4 日星期二 05:29:59 GMT+05:30 2021
2020-07-14 18:46:15.916 7931-8566/com.example.freshtocook E/CONSCRYPT:Sig ALG 名称:SHA256withRSA
2020-07-14 18:46:15.917 7931-8566/com.example.freshtocook E/CONSCRYPT: Signature: -6902f85f8676a61300badd35bbd41f6df636081e17059b9598ab32694434ec9a6366f7618241e05491a2b5a4a53ca3e48f2e4c51b381ace0056ec403e9062abd287972488ac6262709c60af3bb02b4aa3a2e966c84ed9590b1fc6f50e957681648e0fb250111741e5dad73651cb4d9efbe97acbf2a371b0ceceec9e402bdbedf2f5dfec54844a46c4946a9404ed6a9028ddf1aaed1d34dda3a09dc551916d228b4b98abaf4d3942637651b452ba7b5909b6140f3a69ad4752dbf2d64675898e40fbbe707d3ae7cb1aeb0b210fbe46b3fc949bef45179fe3bb3b9631e586cbc3f17d9c18e8b61a02cb7d5e0413f185b7f345c5612ea8b55f61d2f2340ee63e8be
您需要从源域下载证书。只需打开 SSL 证书并将图像拖放到 android 项目的原始目录中。重命名并删除扩展名和 ' . '句号。
我的依赖项是这样的
dependencies {
implementation fileTree( dir: 'libs', include: ['*.jar'] )
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// https://mvnrepository.com/artifact/com.koushikdutta.ion/ion
implementation group: 'com.koushikdutta.ion', name: 'ion', version: '2.2.0'
}
我使用的是 Ion 2.2.0,并且可以很好地处理您无法正常工作的图像。
import java.io.InputStream;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class MainActivity extends AppCompatActivity {
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = findViewById(R.id.ntImg);
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// cert file stored in \app\src\main\res\raw
InputStream caInput = getResources().openRawResource(R.raw.freshtocook);
Certificate ca = cf.generateCertificate(caInput);
caInput.close();
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, wrappedTrustManagers, null);
AsyncSSLSocketMiddleware sslMiddleWare = Ion.getDefault(MainActivity.this).getHttpClient().getSSLSocketMiddleware();
sslMiddleWare.setTrustManagers(wrappedTrustManagers);
sslMiddleWare.setHostnameVerifier(getHostnameVerifier());
sslMiddleWare.setSSLContext(sslContext);
Ion.with(MainActivity.this)
.load("https://freshtocook.in/uploads/banner/47a16ffc2fc5935dccd37574083c6201.jpg")
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap bitmap) {
img.setImageBitmap(bitmap);
}
});
} catch (Exception e) {
}
}
private HostnameVerifier getHostnameVerifier() {
return new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
// or the following:
// HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
// return hv.verify("www.yourserver.com", session);
}
};
}
private TrustManager[] getWrappedTrustManagers(TrustManager[] trustManagers) {
final X509TrustManager originalTrustManager = (X509TrustManager) trustManagers[0];
return new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return originalTrustManager.getAcceptedIssuers();
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
try {
if (certs != null && certs.length > 0) {
certs[0].checkValidity();
} else {
originalTrustManager.checkClientTrusted(certs, authType);
}
} catch (CertificateException e) {
Log.w("checkClientTrusted", e.toString());
}
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
try {
if (certs != null && certs.length > 0) {
certs[0].checkValidity();
} else {
originalTrustManager.checkServerTrusted(certs, authType);
}
} catch (CertificateException e) {
Log.w("checkServerTrusted", e.toString());
}
}
}
};
}
}
为了进一步支持,我的清单如下所示
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
从这里拖放证书。单击锁定图标 > 查看证书 > 将其拖放到原始文件夹中。并记得重命名 不要留下名称以外的任何部分。
我正在尝试使用 Glide 加载图像 URL。 错误。
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
我在 google 中搜索了这个错误,它说是 https 问题,但之前我在其他项目中工作,该项目也在 https.it 工作 fine.why https 是问题还是这是其他问题?
图片加载:
Glide.with(context)
.load(bannerImageModel.getOutput().get(position).getBanner_img())
.apply(new RequestOptions().
diskCacheStrategy(DiskCacheStrategy.ALL))
.into(view);
link 1 : https://freshtocook.in/uploads/banner/47a16ffc2fc5935dccd37574083c6201.jpg
link 2 : https://freshtocook.in/uploads/banner/7eecf823e008a0bb93f347d994b6e534.jpg
link 3 : https://freshtocook.in/uploads/banner/62d69dfa30acabbfe60bc77c5f19cc53.jpg
完全错误:
javax.net.ssl.SSLHandshakeException(java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。) 调用 GlideException#logRootCauses(String) 获取更多细节 原因(1 之 1):class com.bumptech.glide.load.engine.GlideException:获取数据失败,class java.io.InputStream,REMOTE 有1个原因: javax.net.ssl.SSLHandshakeException(java.security.cert.CertPathValidatorException: 未找到证书路径的信任锚。) 调用 GlideException#logRootCauses(String) 获取更多细节 原因(1 之 1):class com.bumptech.glide.load.engine.GlideException:获取失败 有1个原因: javax.net.ssl.SSLHandshakeException(java.security.cert.CertPathValidatorException: 未找到证书路径的信任锚。) 调用 GlideException#logRootCauses(String) 获取更多细节 原因(1 之 1):class javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。 2020-07-14 18:25:03.367 24169-24169/com.example.freshtocook I/Glide:根本原因(第 1 个,共 1 个) javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。 在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:239) 在 com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:1471) 在 com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:1415) 在 com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:1359) 在 com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:221) 在 com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144) 在 com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106) 在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400) 在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:483) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:135) 在 com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90) 在 com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30) 在 com.bumptech.glide.load.data.HttpUrlFetcher.loadDataWithRedirects(HttpUrlFetcher.java:104) 在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:59) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.java:164) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.java:154) 在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:65) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100) 在 com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:62) 在 com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:309) 在 com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:279) 在 com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:235) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:919) 在 com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:446) 原因:java.security.cert.CertificateException:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。 在 com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:668) 在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:513) 在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:432) 在 com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:360) 在 android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94) 在 android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:89) 在 com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:224) 在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(ConscryptFileDescriptorSocket.java:430) 在 com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(本机方法) 在 com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:387) 在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:234) 在 com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:1471) 在 com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:1415) 在 com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:1359) 在 com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:221) 在 com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144) 在 com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106) 在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400) 在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:483) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:135) 在 com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90) 在 com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30) 在 com.bumptech.glide.load.data.HttpUrlFetcher.loadDataWithRedirects(HttpUrlFetcher.java:104) 在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:59) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.java:164) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.java:154) 在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:65) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100) 在 com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:62) 在 com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:309) 在 com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:279) 在 com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:235) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:919) 在 com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:446) 原因:java.security.cert.CertPathValidatorException:未找到证书路径的信任锚。 在 com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:668) 在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:513) 在 com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:432) 在 com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:360) 在 android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94) 在 android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:89) 在 com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:224) 在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(ConscryptFileDescriptorSocket.java:430) 在 com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(本机方法) 在 com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:387) 在 com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:234) 在 com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:1471) 在 com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:1415) 在 com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:1359) 在 com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:221) 在 com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144) 在 com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106) 在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400) 在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:483) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:135) 在 com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90) 在 com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30) 在 com.bumptech.glide.load.data.HttpUrlFetcher.loadDataWithRedirects(HttpUrlFetcher.java:104) 在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:59) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.java:164) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.java:154) 在 com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:65) 在 com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100) 在 com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:62) 在 com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:309) 在 com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:279) 在 com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:235) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:919) 在 com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:446) 2020-07-14 18:25:03.457 24169-24705/com.example.freshtocook I/System.out: (HTTPLog)-Static: isSBSettingEnabled false 2020-07-14 18:25:03.458 24169-24705/com.example.freshtocook I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
现在使用 ION 库出现此错误:
/ViewRootImpl: sendUserActionEvent() mView 返回。 2020-07-14 18:46:15.892 7931-8566/com.example.freshtocook E/CONSCRYPT: ------------------不受信任的链: -- ---------------------- 2020-07-14 18:46:15.892 7931-8566/com.example.freshtocook E/CONSCRYPT: == Chain0 == 版本:3 2020-07-14 18:46:15.893 7931-8566/com.example.freshtocook E/CONSCRYPT:AuthorityKeyIdentifier:418301680148d8c5ec454ad8ae177e99bf99b05e1b8018d61e1 2020-07-14 18:46:15.893 7931-8566/com.example.freshtocook E/CONSCRYPT:SubjectKeyIdentifier:416041493ef6a0cb4e08cbdefeb4fca54cd8872b99d23a0 2020-07-14 18:46:15.893 7931-8566/com.example.freshtocook E/CONSCRYPT:序列号:74e9c119b31c8edeb61e2c05de385e5a 2020-07-14 18:46:15.894 7931-8566/com.example.freshtocook E/CONSCRYPT: SubjectDN: CN=freshtocook.in 2020-07-14 18:46:15.895 7931-8566/com.example.freshtocook E/CONSCRYPT:IssuerDN:CN=Sectigo RSA 域验证安全服务器 CA,O=Sectigo Limited,L=Salford,ST=大曼彻斯特,C=GB 2020-07-14 18:46:15.916 7931-8566/com.example.freshtocook E/CONSCRYPT:不早于:Sun May 03 05:30:00 GMT+05:30 2020 2020-07-14 18:46:15.916 7931-8566/com.example.freshtocook E/CONSCRYPT:不晚于:5 月 4 日星期二 05:29:59 GMT+05:30 2021 2020-07-14 18:46:15.916 7931-8566/com.example.freshtocook E/CONSCRYPT:Sig ALG 名称:SHA256withRSA 2020-07-14 18:46:15.917 7931-8566/com.example.freshtocook E/CONSCRYPT: Signature: -6902f85f8676a61300badd35bbd41f6df636081e17059b9598ab32694434ec9a6366f7618241e05491a2b5a4a53ca3e48f2e4c51b381ace0056ec403e9062abd287972488ac6262709c60af3bb02b4aa3a2e966c84ed9590b1fc6f50e957681648e0fb250111741e5dad73651cb4d9efbe97acbf2a371b0ceceec9e402bdbedf2f5dfec54844a46c4946a9404ed6a9028ddf1aaed1d34dda3a09dc551916d228b4b98abaf4d3942637651b452ba7b5909b6140f3a69ad4752dbf2d64675898e40fbbe707d3ae7cb1aeb0b210fbe46b3fc949bef45179fe3bb3b9631e586cbc3f17d9c18e8b61a02cb7d5e0413f185b7f345c5612ea8b55f61d2f2340ee63e8be
您需要从源域下载证书。只需打开 SSL 证书并将图像拖放到 android 项目的原始目录中。重命名并删除扩展名和 ' . '句号。
我的依赖项是这样的
dependencies {
implementation fileTree( dir: 'libs', include: ['*.jar'] )
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// https://mvnrepository.com/artifact/com.koushikdutta.ion/ion
implementation group: 'com.koushikdutta.ion', name: 'ion', version: '2.2.0'
}
我使用的是 Ion 2.2.0,并且可以很好地处理您无法正常工作的图像。
import java.io.InputStream;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class MainActivity extends AppCompatActivity {
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = findViewById(R.id.ntImg);
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// cert file stored in \app\src\main\res\raw
InputStream caInput = getResources().openRawResource(R.raw.freshtocook);
Certificate ca = cf.generateCertificate(caInput);
caInput.close();
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, wrappedTrustManagers, null);
AsyncSSLSocketMiddleware sslMiddleWare = Ion.getDefault(MainActivity.this).getHttpClient().getSSLSocketMiddleware();
sslMiddleWare.setTrustManagers(wrappedTrustManagers);
sslMiddleWare.setHostnameVerifier(getHostnameVerifier());
sslMiddleWare.setSSLContext(sslContext);
Ion.with(MainActivity.this)
.load("https://freshtocook.in/uploads/banner/47a16ffc2fc5935dccd37574083c6201.jpg")
.asBitmap()
.setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap bitmap) {
img.setImageBitmap(bitmap);
}
});
} catch (Exception e) {
}
}
private HostnameVerifier getHostnameVerifier() {
return new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
// or the following:
// HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
// return hv.verify("www.yourserver.com", session);
}
};
}
private TrustManager[] getWrappedTrustManagers(TrustManager[] trustManagers) {
final X509TrustManager originalTrustManager = (X509TrustManager) trustManagers[0];
return new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return originalTrustManager.getAcceptedIssuers();
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
try {
if (certs != null && certs.length > 0) {
certs[0].checkValidity();
} else {
originalTrustManager.checkClientTrusted(certs, authType);
}
} catch (CertificateException e) {
Log.w("checkClientTrusted", e.toString());
}
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
try {
if (certs != null && certs.length > 0) {
certs[0].checkValidity();
} else {
originalTrustManager.checkServerTrusted(certs, authType);
}
} catch (CertificateException e) {
Log.w("checkServerTrusted", e.toString());
}
}
}
};
}
}
为了进一步支持,我的清单如下所示
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>