Android端录制音频无法上传至Firebase Storage问题求助
故障排查与修复方案
1 核心错误:上传的Uri指向错误
你当前uploadAudio方法中构造的Uri指向的是App外部存储的根目录文件夹,不是你录制生成的具体音频文件,这是上传失败的最主要原因:
// 错误写法:指向的是文件夹路径,不是具体音频文件 String recordPath = getActivity().getExternalFilesDir("/").getAbsolutePath(); Uri uri = Uri.fromFile(new File(recordPath));
修复方法:构造Uri时使用你录制时生成的全局文件名recordFile,拼接得到完整的音频文件路径:
private void uploadAudio() { progressDialog.setMessage("Uploading..."); progressDialog.show(); File rootDir = getActivity().getExternalFilesDir("/"); // 指向具体的录制音频文件 File audioFile = new File(rootDir, recordFile); Uri uri = Uri.fromFile(audioFile); StorageReference filePath = audioReference.child("Audio").child(audioFile.getName()); // 后续上传逻辑 }
2 缺失错误监听导致无法定位具体问题
你当前仅添加了上传成功的回调,没有配置失败、取消的回调,就算出现异常也没法拿到报错信息,建议补全回调打印日志:
filePath.putFile(uri) .addOnSuccessListener(taskSnapshot -> { progressDialog.dismiss(); // 可选:打印上传成功的路径 Log.d("UploadSuccess", taskSnapshot.getStorage().getPath()); }) .addOnFailureListener(e -> { progressDialog.dismiss(); // 打印错误信息,可直接定位权限、规则、文件不存在等问题 Log.e("UploadFail", e.getMessage(), e); }) .addOnCanceledListener(() -> { progressDialog.dismiss(); Log.d("UploadCancel", "上传被取消"); });
3 其他潜在需要排查的问题
- 录制逻辑顺序错误:你当前点击录制按钮时,先执行
startRecording()再检查录音权限,若权限未授予的情况下,MediaRecorder初始化会抛出异常,建议调整为先检查权限,权限通过后再启动录制:// 调整btn_taptorecord的点击逻辑 @Override public void onClick(View v) { if (isRecording) { stopRecording(); isRecording = false; } else { // 先检查权限,通过后再启动录制 if (checkPermissions()) { startRecording(); isRecording = true; } } } - Firebase Storage权限规则问题:如果你的Storage规则默认禁止未认证用户读写,会直接返回权限拒绝错误,测试阶段可以临时放开规则验证上传功能:
// 仅测试使用,上线前务必替换为符合业务安全的规则 rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if true; } } } - Android存储权限适配:如果你的App targetSdkVersion >= 33,需要额外申请
READ_MEDIA_AUDIO权限才能读取本地音频文件。
内容的提问来源于stack exchange,提问作者Aryan Yadav
相关产品推荐
相关产品推荐

