android - 将图像上传到 Firebase 存储后如何获取图像 uri?
问题描述
我正在开发一个 kotlin 项目,该项目要求用户使用相机或图库插入图像,然后应用程序会将图像上传到 Firebase 存储,并将图像 uri 保存到 FireStore。之后,我用 glide 获得所有图像并用 recyclerview 显示它。这是我的项目类:
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
// ...
}
}
推荐阅读
- html - 页脚底部的空白区域(在移动设备上)
- manifest - Cloud Foundry cf push 命令中是否有办法让 manifest.yml 包含多个“配置文件”?
- python - Python 和 VS 代码问题
- xcode - 如何使用 SystemC 修复 Xcode 中的永久 EXC_BAD_ACCESS 异常?
- matlab - 使用 imagesc 和固定轴映射
- php - 如何在 HTML 电子邮件中调用 PHP 函数
- macos - 为什么 Xcode 与 Target 成员不匹配?
- shell - socat:是否可以将接收到的消息在服务器端(unix 域套接字)传递给函数?
- angularjs - 如何获取动态添加指令的元素值
- java - Android Gradle 中的版本依赖冲突