废弃API startActivityForResult/onActivityResult致音频无法上传Firebase Storage
解决Firebase Storage音频上传失败+废弃API替换问题
一、替换废弃的startActivityForResult/onActivityResult
AndroidX已废弃旧的页面返回结果处理体系,改用Activity Result Contracts替代,具体修改步骤:
- 在MainActivity类中注册文件选择的ActivityResultLauncher:
private val pickAudioLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> uri?.let { // 这里直接编写原onActivityResult中处理选中文件的逻辑 uploadAudioToFirebase(it) } }
- 替换原
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
相关产品推荐
相关产品推荐

