我在Firebase Storage Kotlin SDK中遇到了一个奇怪的错误.我正在使用putFile()函数将图片上传到Firebase.一切似乎都很顺利,我能够做到这一点.然而,当我try 测试并禁用互联网连接时,该函数不会返回任何内容.我的意思是,我已经安排了所有UploadTask个听众,但他们中没有一个人被叫来.它只是一直在"装填".有没有人有过类似的问题?

val storage = FirebaseStorage.getInstance().reference
val remoteImagePath = "images/username/imageName.jpg"
val imageRef = storage.child(remoteImagePath)
val result = imageRef.putFile(image)
result.addOnSuccessListener {
    Log.d("ViewModel", "Success!")
}.addOnFailureListener { error ->
    Log.d("ViewModel", "${error.message}")
}.addOnCompleteListener{
    Log.d("ViewModel", "Completed!")
}

推荐答案

然而,当我try 测试并禁用互联网连接时,该函数不会返回任何内容.

这是预期行为,因为您禁用了设备上的互联网连接.如果设备没有连接到互联网,你就无法将图像上传到云存储.

然而,云存储supports resuming uploads的Firebase SDK.这意味着,一旦您在在线状态下开始上传文件,您可以在以后继续该文件.因此,为了能够恢复特定文件的上载操作,您必须至少在线到上载开始,并且能够调用UploadTask.TaskSnapshot#getUploadSessionUri()来获取"ploadSessionUri"的值.此URI的有效期约为一周,可用于稍后通过将值传递给StorageReference#putFile(Uri, StorageMetadata, Uri)方法来恢复上传.如果没有它,您将无法恢复任何上传.如果您需要该URI对象在应用程序重新启动时保持不变,那么您可以将该对象保存在持久存储中,比如SharedPreferences,或者在Data Store中保存得更好.

因此,如果您处于离线状态,并且未设法获取会话URI,则无法恢复上载.没有自动重试的机制.

我的意思是,我已经放置了所有的UploadTask监听器,但没有一个被调用.

正如您已经注意到的,StorageReference#putFile(uri: Uri)方法返回的对象类型是UploadTask.因此,您可以附加一个监听程序,以查看操作何时完成或因异常而失败.在大多数情况下,当存储服务器因不正确的安全规则而拒绝操作时,将调用onFailure.

附注:

祝贺您的视频教程;)

Android相关问答推荐

无法列出目录中的文件'

如何在Android Emulator上从物理设备接收TCP消息

如何让用户与我的应用生成的多个音频文件交互

无法安装后重新编译android代码'

Android应用程序中的背景问题

推断的类型是片段,但应为上下文

我如何剪裁一个可由另一个合成的

strings.xml中字符串数组中的占位符

OverridePendingTransition已弃用,我该怎么办?

SDK 33 的问题 - 面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

错误:参数的类型必须是用@Entity注释的类或其集合/array. java.lang.String tocd);

Android:使用依赖项 ViewModelProviderFactory 初始化 ViewModel 的正确方法

发布 MAUI 应用程序时出现遇到重复程序集错误

Jetpack Compose 动画性能问题

验证硬编码密码

java.lang.String 类型的值 Forbidden 无法转换为 JSONObject

前台服务通知需要几秒钟才能显示

如何对齐文本和图标可组合,以便即使在文本溢出后它们也能保持在一起?

线圈单元测试 - 如何做到这一点?

为什么使用 React Native 和 expo 创建的 APK 体积这么大?