You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

废弃API startActivityForResult/onActivityResult致音频无法上传Firebase Storage

解决Firebase Storage音频上传失败+废弃API替换问题

一、替换废弃的startActivityForResult/onActivityResult

AndroidX已废弃旧的页面返回结果处理体系,改用Activity Result Contracts替代,具体修改步骤:

  1. 在MainActivity类中注册文件选择的ActivityResultLauncher:
private val pickAudioLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
    uri?.let {
        // 这里直接编写原onActivityResult中处理选中文件的逻辑
        uploadAudioToFirebase(it)
    }
}
  1. 替换原startActivityForResult调用代码:
// 废弃的旧代码:
// val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "audio/*" }
// startActivityForResult(intent, PICK_AUDIO_REQUEST_CODE)

// 替换为:
pickAudioLauncher.launch("audio/*")

完成以上修改后,废弃标记会完全消除,且功能逻辑与原代码一致。

二、排查上传失败的其他可能原因

即使替换了API,仍可能存在以下问题导致上传失败:

  • 混淆Firebase Storage与Firestore规则:你提到修改了Firestore规则,但音频上传依赖的是Firebase Storage规则。测试阶段可临时设置Storage规则为allow read, write: if true;,上线后再调整为安全规则。
  • 文件访问权限缺失:Android 13+需申请READ_MEDIA_AUDIO权限,Android 12及以下需申请READ_EXTERNAL_STORAGE权限,且要在代码中完成运行时权限申请。
  • 未添加上传失败监听:检查你的uploadAudioToFirebase方法,必须添加失败监听才能定位问题,示例如下:
fun uploadAudioToFirebase(uri: Uri) {
    val storageRef = FirebaseStorage.getInstance().reference.child("audios/${System.currentTimeMillis()}.mp3")
    storageRef.putFile(uri)
        .addOnSuccessListener {
            Toast.makeText(this, "Successfully Uploaded :)", Toast.LENGTH_SHORT).show()
        }
        .addOnFailureListener { e ->
            // 打印错误日志,快速定位失败原因
            Log.e("FirebaseUpload", "Upload failed", e)
            Toast.makeText(this, "Upload failed: ${e.message}", Toast.LENGTH_SHORT).show()
        }
}
  • Firebase初始化异常:确认项目已正确配置Firebase,google-services.json文件放置路径正确,Storage实例初始化正常。
  • 文件大小超出限制:Firebase Storage免费版默认单文件最大5GB,若音频文件过大也会导致上传失败。

内容的提问来源于stack exchange,提问作者snail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:36:17