如何使用 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()