android - 将文件上传到 Firebase 存储并获取 downloadUrl。如何在 Kotlin 函数中返回结果?

标签 android firebase kotlin firebase-storage

我有一个使用 uploadTask 将本地文件上传到 Firestore 存储的功能。我按照 docs 中给出的说明进行操作.这是我的代码:

fun uploadAudioFile(file: File){
    val audioFilePathUri = Uri.fromFile(file)
    val ref = currentUserRef.child("audioFiles/" + System.currentTimeMillis() + "." + "m4a")
    val uploadTask = ref.putFile(audioFilePathUri)

    val urlTask =
        uploadTask.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>> { task ->
            if (!task.isSuccessful) {
                task.exception?.let {
                    throw it
                }
            }
            return@Continuation ref.downloadUrl
        }).addOnCompleteListener { task ->
            if (task.isSuccessful) {
                val downloadUri = task.result
                Log.d("STORAGE_UTIL", "downloadUri: " + downloadUri)
            } else {
                // Handle failures
            }
        }
}

该函数工作正常并呈现正确的 downloadUri

现在我的问题是:我想重写这个函数,以便它返回 downloadUri。像这样:

 fun uploadAudioFile(file: File): Uri? {
    val audioFilePathUri = Uri.fromFile(file)
    val ref = currentUserRef.child("audioFiles/" + System.currentTimeMillis() + "." + "m4a")
    val uploadTask = ref.putFile(audioFilePathUri)

    val urlTask =
        uploadTask.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>> { task ->
            if (!task.isSuccessful) {
                task.exception?.let {
                    throw it
                }
            }
            return@Continuation ref.downloadUrl
        }).addOnCompleteListener { task ->
            if (task.isSuccessful) {
                val downloadUri = task.result
                Log.d("STORAGE_UTIL", "downloadUri: " + downloadUri)
            } else {
                // Handle failures
            }
        }
    return downloadUri 
}

这给了我一个关于返回语句的 downloadUri Unresolved 引用。 我该如何解决这个问题?

最佳答案

您无法将 downloadUri 作为方法的结果返回,这是因为 Firebase API 是异步。这意味着 onComplete() 函数在被调用后立即返回,并且它返回的 Task 的回调将在稍后调用。因此,不幸的是,无法保证需要多长时间,可能需要几百毫秒到几秒才能获得数据。因为该方法会立即返回,所以您尝试返回的 downloadUri 变量的值尚未从回调中填充。

基本上,您正在尝试从异步 API 同步返回一个值。那不是一个好主意。您应该按预期异步处理 API。

快速解决此问题的方法是在 onComplete() 方法中使用 downloadUri 变量 only 的值。基本上,uploadAudioFile() 方法中存在的所有逻辑都应该移到回调中。如果您想在回调之外使用该值,我建议您从这个 post 中看到我的答案的最后一部分。 我在其中解释了如何使用自定义回调来完成。

关于android - 将文件上传到 Firebase 存储并获取 downloadUrl。如何在 Kotlin 函数中返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57818573/

相关文章:

android - 使用 Cardslib : "CardView cannot be cast to CardNativeView"

javascript promise 不会嵌套并返回使用 firebase 云函数的通知错误

android - 另一个 Android 应用因 AdMob 而崩溃

javascript - 更新 Firestore 文档时可以动态更改键和值吗?

node.js - 处理队列中的任务后更新客户端

android - 如何在我的应用程序中添加 App Indexing 概念?

java - 如何使 addListenerForSingleValueEvent 在循环中工作?

arrays - Kotlin - 对象数组(无 null)

Kotlin 中的 Android Parcelable

android - ArrayList 的实时数据未观察(Kotlin)?