将图像上传到 Firebase 存储后如何获取图像 uri?

How to get image uri after uploading image to Firebase Storage?

我正在做一个 kotlin 项目,该项目要求用户使用相机或图库插入图像,然后应用会将图像上传到 Firebase Storage,并将图像 uri 保存到 FireStore。 之后,我使用 glide 获取所有图像并使用 recyclerview 显示它。 这是我的商品 class:

data class Item(var uid: String?=null,
                     var productId:String?=null,
                     var productCategory: String?=null,
                     var productWeight: Double?=null,
                     var productDescription: String?=null,
                     var productIcon:String?=null)

稍后,我使用以下代码显示图像:

override fun onBindViewHolder(holder: itemViewHolder, position: Int) {
        val produk=listOfItem[position]
        holder.kategori.text=produk.productCategory
        holder.berat.text=produk.productWeight.toString()

        //img
        Glide.with(context)
            .load(produk.productIcon)
            .into(holder.gambarBarang)

    }

我使用这段代码在上传图片后获取图片 uri:

storageReference.putFile(image_Uri!!)
                .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    val downloadUri = task.result
                    val item = Item(
                        ""+firebaseAuth.uid,
                        timeStamp,
                        kategori,
                        berat_sampah.toDouble(),
                        deskripsi,
                        ""+downloadUri,
                    )

但是当我尝试使用上述方法显示它时,图像不显示。问题是变量 downloadUri。它没有得到正确的 uri。我尝试记录它并得到:D/TAG: com.google.firebase.storage.UploadTask$TaskSnapshot@6e38b25。在那之后,我尝试:

storageReference.putFile(image_Uri!!)
                .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    val downloadUri = task.result?.uploadSessionUri
                    val item = Item(
                        ""+firebaseAuth.uid,
                        timeStamp,
                        kategori,
                        berat_sampah.toDouble(),
                        deskripsi,
                        ""+downloadUri,
                    )

但是当运行时,图像仍然没有出现。我尝试再次记录下载 uri 并得到:

D/TAG: https://firebasestorage.googleapis.com/v0/b/rongsokin-97e5c.appspot.com/o?name=product_images%2F1628401535415&uploadType=resumable&upload_id=ADPycdv0k03oF-49BTl61tKIC4Q-05J3cfOMqYpfUi9USXOMOGQmiOYalhVOSlRr6HP-ScqN6Hfv8NVrkI_qcU-CG6U&upload_protocol=resumable

然后我尝试:

storageReference.putFile(image_Uri!!)
                .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    val downloadUri = image_Uri
                    val item = Item(
                        ""+firebaseAuth.uid,
                        timeStamp,
                        kategori,
                        berat_sampah.toDouble(),
                        deskripsi,
                        ""+downloadUri,
                    )

之后我再次登录 downloadUri 并得到: D/TAG: content://media/external/images/media/85 我知道这不是正确的方法,因为我只是获取图像的本地 uri,但我这样做是为了确定我显示图像的方式是否错误或我的方式有误'我正在获取 uri。并且这种方式成功显示了图像(尽管没有使用正确的 uri)。任何人都知道如何在上传到 firebase 后获取图像 uri,然后用它来显示图像?

上传文件后必须调用getDownloadUrl(),或者至少调用参考路径上的方法

storageRef.child("users/me/profile.png").downloadUrl.addOnSuccessListener {
    // Got the download URL for 'users/me/profile.png'
}.addOnFailureListener {
    // Handle any errors
}

完整示例:

val ref = storageRef.child("images/mountains.jpg")
uploadTask = ref.putFile(file)

val urlTask = uploadTask.continueWithTask { task ->
    if (!task.isSuccessful) {
        task.exception?.let {
            throw it
        }
    }
    ref.downloadUrl
}.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val downloadUri = task.result
    } else {
        // Handle failures
        // ...
    }
}