将文件上传到 Firebase 存储时出现 "Task is not yet complete" 错误
Getting "Task is not yet complete" error when uploading file to Firebase Storage
所以我做了一个应用程序,用户可以以图像和描述的形式提供数据,然后将这些数据上传到 Firestore,图像将保存到 Firebase Storage。 运行后,图片成功保存到Firebase Storage,但Firestore中的数据没有变化。
我使用此代码:
val filePathAndName="product_images/"+""+timeStamp
val storageReference=FirebaseStorage.getInstance().getReference(filePathAndName)
val uploadTask= storageReference.putFile(image_Uri)
uploadTask.addOnSuccessListener { taskSnapShot->
val uriTask=taskSnapShot.storage.downloadUrl
val downloadImageUri=uriTask.result
val item = Item(
""+firebaseAuth.uid,
timeStamp,
kategori,
berat_sampah.toDouble(),
deskripsi,
""+downloadImageUri,
)
FirestoreClass().addItem(this@AddProductActivity, FirestoreClass().getCurrentUserID(),item)
在我的 FirestoreClass 中:
class FirestoreClass {
private val mFireStore=FirebaseFirestore.getInstance()
fun addItem(activity: AddProductActivity, userId: String, itemInfo: Item){
mFireStore.collection(Constants.USERS).document(userId)
.collection(Constants.PRODUCT).document(itemInfo.productId)
.set(itemInfo, SetOptions.merge())
}
fun getCurrentUserID(): String{
val currentUser= FirebaseAuth.getInstance().currentUser
var currentUserID=""
if(currentUser!=null)
{
currentUserID=currentUser.uid
}
return currentUserID
}
}
好像是图片上传到Storage后,activity被强行关闭了。并显示此错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.b1, PID: 15693
java.lang.IllegalStateException: Task is not yet complete
at com.google.android.gms.common.internal.Preconditions.checkState(com.google.android.gms:play-services-basement@@17.1.0:29)
at com.google.android.gms.tasks.zzu.zzb(Unknown Source:121)
at com.google.android.gms.tasks.zzu.getResult(Unknown Source:12)
at com.example.b1.activity.AddProductActivity$addProduct.onSuccess(AddProductActivity.kt:163)
at com.example.b1.activity.AddProductActivity$addProduct.onSuccess(AddProductActivity.kt:35)
at com.google.firebase.storage.StorageTask.lambda$new[=13=]$StorageTask(StorageTask.java:123)
at com.google.firebase.storage.-$$Lambda$StorageTask$xlHsb5OfSRp-di5vg8sdDdXsCO4.raise(Unknown Source:6)
at com.google.firebase.storage.TaskListenerImpl.lambda$onInternalStateChanged$TaskListenerImpl(TaskListenerImpl.java:90)
at com.google.firebase.storage.-$$Lambda$TaskListenerImpl$S8elBxPWPDCBbbHv0Z6yA1jvX68.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
为什么会这样? Error
中提到的尚未完成的任务是什么
我认为问题可能出在这里:
val uriTask=taskSnapShot.storage.downloadUrl
val downloadImageUri=uriTask.result
downloadUrl
属性 实际上是一个异步方法调用。所以你不能只从任务中得到结果,而必须等待它——类似于你已经为 putFile()
.
所做的
像这样:
taskSnapShot.storage.downloadUrl.addOnSuccessListener { task ->
val downloadUri = task.result
// Use the downloadUri here
}
另请参阅 getting the download URL for an uploaded file 上 Firebase 文档中的示例。
所以我做了一个应用程序,用户可以以图像和描述的形式提供数据,然后将这些数据上传到 Firestore,图像将保存到 Firebase Storage。 运行后,图片成功保存到Firebase Storage,但Firestore中的数据没有变化。 我使用此代码:
val filePathAndName="product_images/"+""+timeStamp
val storageReference=FirebaseStorage.getInstance().getReference(filePathAndName)
val uploadTask= storageReference.putFile(image_Uri)
uploadTask.addOnSuccessListener { taskSnapShot->
val uriTask=taskSnapShot.storage.downloadUrl
val downloadImageUri=uriTask.result
val item = Item(
""+firebaseAuth.uid,
timeStamp,
kategori,
berat_sampah.toDouble(),
deskripsi,
""+downloadImageUri,
)
FirestoreClass().addItem(this@AddProductActivity, FirestoreClass().getCurrentUserID(),item)
在我的 FirestoreClass 中:
class FirestoreClass {
private val mFireStore=FirebaseFirestore.getInstance()
fun addItem(activity: AddProductActivity, userId: String, itemInfo: Item){
mFireStore.collection(Constants.USERS).document(userId)
.collection(Constants.PRODUCT).document(itemInfo.productId)
.set(itemInfo, SetOptions.merge())
}
fun getCurrentUserID(): String{
val currentUser= FirebaseAuth.getInstance().currentUser
var currentUserID=""
if(currentUser!=null)
{
currentUserID=currentUser.uid
}
return currentUserID
}
}
好像是图片上传到Storage后,activity被强行关闭了。并显示此错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.b1, PID: 15693
java.lang.IllegalStateException: Task is not yet complete
at com.google.android.gms.common.internal.Preconditions.checkState(com.google.android.gms:play-services-basement@@17.1.0:29)
at com.google.android.gms.tasks.zzu.zzb(Unknown Source:121)
at com.google.android.gms.tasks.zzu.getResult(Unknown Source:12)
at com.example.b1.activity.AddProductActivity$addProduct.onSuccess(AddProductActivity.kt:163)
at com.example.b1.activity.AddProductActivity$addProduct.onSuccess(AddProductActivity.kt:35)
at com.google.firebase.storage.StorageTask.lambda$new[=13=]$StorageTask(StorageTask.java:123)
at com.google.firebase.storage.-$$Lambda$StorageTask$xlHsb5OfSRp-di5vg8sdDdXsCO4.raise(Unknown Source:6)
at com.google.firebase.storage.TaskListenerImpl.lambda$onInternalStateChanged$TaskListenerImpl(TaskListenerImpl.java:90)
at com.google.firebase.storage.-$$Lambda$TaskListenerImpl$S8elBxPWPDCBbbHv0Z6yA1jvX68.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
为什么会这样? Error
中提到的尚未完成的任务是什么我认为问题可能出在这里:
val uriTask=taskSnapShot.storage.downloadUrl
val downloadImageUri=uriTask.result
downloadUrl
属性 实际上是一个异步方法调用。所以你不能只从任务中得到结果,而必须等待它——类似于你已经为 putFile()
.
像这样:
taskSnapShot.storage.downloadUrl.addOnSuccessListener { task ->
val downloadUri = task.result
// Use the downloadUri here
}
另请参阅 getting the download URL for an uploaded file 上 Firebase 文档中的示例。