uni-app app端录音上传需分平台处理权限、路径与格式:ios用沙盒路径,android/harmonyos需realpathsync转换ohos://路径,录音优先aac格式但须校验服务端兼容性,采样率设32000、码率48000更稳妥。

App端录音上传在uni-app里不能只靠uni.getRecorderManager()一招走天下,必须区分iOS和Android权限配置、文件路径处理、以及上传前的格式兼容性校验。
uni.getRecorderManager()在App端的实际行为差异
这个API在App端是桥接到原生录音能力的,但不同平台返回的tempFilePath路径含义完全不同:
- iOS返回的是沙盒内临时路径(如
file:///var/mobile/Containers/Data/Application/xxx/tmp/xxx.aac),可直接用于uni.uploadFile() - Android(尤其鸿蒙NEXT)可能返回
ohos://data/xxx.aac这类URI,uni.uploadFile()会直接报错uploadFile:fail invalid file path - 部分Android机型(如华为EMUI)还会把录音存到公共目录,但路径不带
file://前缀,需手动补全
所以拿到res.tempFilePath后,务必先用uni.getFileSystemManager().getFileInfo()校验文件是否存在且可读,否则上传必挂。
Android/HarmonyOS上录音文件路径必须转成本地绝对路径
鸿蒙NEXT或较新Android版本中,recorderManager.onStop返回的路径不是标准文件系统路径,直接传给uni.uploadFile()会失败。正确做法是用uni.getFileSystemManager().realPathSync()或UTS代码做转换:
const fs = uni.getFileSystemManager();
// 鸿蒙NEXT下常见情况
if (res.tempFilePath.startsWith('ohos://')) {
try {
const realPath = fs.realPathSync(res.tempFilePath);
uploadAudio(realPath); // 这才是能上传的路径
} catch (e) {
console.error('realPathSync failed:', e);
// 回退:尝试拷贝到临时目录再上传
}
}
注意:realPathSync在某些旧版uni-app运行时可能未实现,需配合条件编译// #ifdef APP-PLUS加兜底逻辑。
上传前必须检查音频格式与服务端要求是否匹配
App端默认录音格式是aac,但很多后端ASR服务只认mp3或wav,硬传aac会导致解析失败,错误信息通常是Unsupported audio format或Invalid audio header:
- 优先让服务端支持
aac(推荐,省去前端转码开销) - 若必须转格式,不要用Web端方案(如ffmpeg.js),App端应调用原生插件(如
uni-plugin-audio-converter)或UTS封装FFmpeg for Android/iOS - 采样率别设太高——
sampleRate: 44100在部分Android机型上会触发静音或崩溃,32000更稳妥
还有一个隐藏坑:encodeBitRate设为64000以上时,某些低端Android机录音会卡顿甚至闪退,实测48000是兼容性甜点值。
上传失败时的重试与日志定位要点
上传失败不能只看uni.uploadFile()的fail回调,要分层排查:
- 网络层:检查
statusCode !== 200,特别是413 Request Entity Too Large(录音太长) - 文件层:确认
tempFilePath对应文件大小是否为0(常见于权限拒绝后仍触发onStop) - 权限层:iOS需在
Info.plist加NSMicrophoneUsageDescription,Android需在AndroidManifest.xml声明android.permission.RECORD_AUDIO,鸿蒙则必须配module.json5里的ohos.permission.MICROPHONE
最容易被忽略的是:用户首次拒绝麦克风权限后,再次调用recorderManager.start()不会弹窗,也不会进onError,而是静默失败——得先用uni.authorize({scope: 'scope.record'})检测并引导设置。











