如何使用 https 不安全证书在 Coil 中加载图像
How to load image in Coil with https not secure certificate
我正在尝试使用 Kotlin 中的 Coil 库从不安全的 link(没有 SSL 证书)加载图像,但加载失败并加载错误图像。
有没有办法从不安全的 link 加载图像?
将此行添加到 <application>
标签中的 AndroidManifest.xml
:
android:usesCleartextTraffic="true"
使用这些权限制作线圈缓存图像
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
*对于 API 30 岁及以上 *
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
并为早于 API 30
使用旧版请求
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
你准备好了
这是一个适用于 Coil 1.0/2.0 的解决方案。
这不是一个完美的解决方案,因为 okhttp 缓存不与默认的 ImageLoader 共享,但在我的情况下,它可以帮助应用程序的特定部分,其中我有来自第 3 方的未知图像 url提供商(Amazon Prime 等)。我在 Android 电视启动器中使用它,图像 urls 用于推荐频道。
@SuppressLint("CustomX509TrustManager")
private fun initUntrustImageLoader(): ImageLoader {
// Create a trust manager that does not validate certificate chains
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
@SuppressLint("TrustAllX509TrustManager")
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}
@SuppressLint("TrustAllX509TrustManager")
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}
override fun getAcceptedIssuers(): Array<X509Certificate> {
return arrayOf()
}
})
// Install the all-trusting trust manager
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
// Create an ssl socket factory with our all-trusting manager
val sslSocketFactory = sslContext.socketFactory
val client = OkHttpClient.Builder()
.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
.hostnameVerifier { _, _ -> true }.build()
return ImageLoader.Builder(context)
.okHttpClient(client)
.build()
}
在我的 class 开头,我用
实例化了它
private var untrustImageLoader: ImageLoader = initUntrustImageLoader()
我正在尝试使用 Kotlin 中的 Coil 库从不安全的 link(没有 SSL 证书)加载图像,但加载失败并加载错误图像。 有没有办法从不安全的 link 加载图像?
将此行添加到 <application>
标签中的 AndroidManifest.xml
:
android:usesCleartextTraffic="true"
使用这些权限制作线圈缓存图像
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
*对于 API 30 岁及以上 *
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
并为早于 API 30
使用旧版请求android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
你准备好了
这是一个适用于 Coil 1.0/2.0 的解决方案。
这不是一个完美的解决方案,因为 okhttp 缓存不与默认的 ImageLoader 共享,但在我的情况下,它可以帮助应用程序的特定部分,其中我有来自第 3 方的未知图像 url提供商(Amazon Prime 等)。我在 Android 电视启动器中使用它,图像 urls 用于推荐频道。
@SuppressLint("CustomX509TrustManager")
private fun initUntrustImageLoader(): ImageLoader {
// Create a trust manager that does not validate certificate chains
val trustAllCerts = arrayOf<TrustManager>(object : X509TrustManager {
@SuppressLint("TrustAllX509TrustManager")
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}
@SuppressLint("TrustAllX509TrustManager")
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}
override fun getAcceptedIssuers(): Array<X509Certificate> {
return arrayOf()
}
})
// Install the all-trusting trust manager
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
// Create an ssl socket factory with our all-trusting manager
val sslSocketFactory = sslContext.socketFactory
val client = OkHttpClient.Builder()
.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
.hostnameVerifier { _, _ -> true }.build()
return ImageLoader.Builder(context)
.okHttpClient(client)
.build()
}
在我的 class 开头,我用
实例化了它private var untrustImageLoader: ImageLoader = initUntrustImageLoader()