线圈:从Firebase加载图像无法正常工作-无法获取数据。没有提供支持的获取器。

3
 Image(
        modifier = Modifier.size(100.dp).padding(16.dp),
        painter = rememberImagePainter(
            ImageRequest.Builder(LocalContext.current)
 //                    .data("https://media-cldnry.s-nbcnews.com/image/upload/t_fit-760w,f_auto,q_auto:best/streams/2013/March/130326/1C6639340-google-logo.jpg")
                .data(Firebase.storage.getReference("<Redacted>"))
                .crossfade(false)
                .listener(object : ImageRequest.Listener {

                    override fun onError(request: ImageRequest, throwable: Throwable) {
                        super.onError(request, throwable)
                        Log.e("CoilRequest", "${throwable.message}")
                    }
                })
                .placeholder(getShimmerPlaceholder())
                .build()
        ),
        contentDescription = "description",
        contentScale = ContentScale.Fit
    )

注释代码在我从网络上使用一些随机图像时可以工作,但当我使用来自Firebase的托管图像时,在 compose 上无法正常工作,并且我收到了来自coil的错误回调

无法获取数据。没有提供程序支持:gs://

相同的方法在视图中被使用,然而它是有效的。

inline fun ImageView.load(data: data: StorageReference, builder: ImageRequest.Builder.() -> Unit) : Disposable {
    val loadRequest = ImageRequest.Builder(context)
                      .data(data)
                      .target(this@load)
                      .apply(builder).build()
          return FireCoil.loader(context).enqueue(loadRequest)
}

有什么想法吗?谢谢!

图片的URL是什么样子的?它以gs://...开头吗?也许这个资源可以帮助你。它是用Kotlin编写的,使用Jetpack Compose。 - Alex Mamo
嗨,由于这是公司文件的路径,我无法上传图像的确切路径,但它的起始部分无法被Compose读取。此外,我无法查看您提供的链接,因为需要升级帐户才能访问:( - z.g.y
它是否以 gs://... 开头? - Alex Mamo
是的,它会出现 无法获取数据。没有提供支持的获取器:gs://<已打码链接>。我正在使用 io.coil-kt:coil-compose:1.3.2 版本。 - z.g.y
1
你有尝试使用以“http://…”开头的URL来显示图片吗? - Alex Mamo
它在浏览器上不显示,但通过ImageView(非Compose)获取可以正常工作。不确定是否需要检查某些网络配置,例如headers?但是当Firebase图像加载到ImageViews上时,这很奇怪。 - z.g.y
2个回答

7

gs:// 开头的 URL 是 Google Cloud Storage 的本地 URL 格式,许多常见库不识别该格式,其中 Coil 就是其中之一。

要显示数据,您有两个选项:


谢谢@Frank,虽然我仍需要对Uri!进行进一步调整,以使Coil与Composable Image配合使用,但我已经能够通过显式提供硬编码字符串来获取由Task回调返回的图像。 - z.g.y
我还发现我们并不完全只使用 Coil,该项目还使用了一个名为 FireCoil 的单独库,其中包含 ImageViews,看起来是在幕后处理这些事情。 - z.g.y
1
啊,是的,可能是这样。FirebaseUI库中有一个类似的插件,可以让Glide也能识别gs://URL。 - Frank van Puffelen
是的,看起来任何标准的“图像处理”库都会有或需要额外的插件/附加组件来获取“Firebase存储”图像,无论如何,非常感谢@Frank的帮助! - z.g.y

1
我遇到了类似的问题,正如"Frank van Puffelen"所描述的答案,通过将完整的URL添加到rememberAsyncImagePainter中解决了这个问题,就像这样:
Image(
      painter = rememberAsyncImagePainter(
          model = "https://your_url/$imageUrl"
      ),
      contentDescription = null
     )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接