App端可用uni.getRecorderManager()但须iOS配置microphone权限与非空NSMicrophoneUsageDescription、Android声明RECORD_AUDIO权限并运行时调用uni.authorize,录音后必须用uni.saveFile持久化;H5需navigator.mediaDevices.getUserMedia+MediaRecorder;小程序须wx.getRecorderManager()且app.json配requiredPrivateInfos。

直接调用 uni.getRecorderManager() 在 App 端可行,但在 H5 和微信小程序端必须换方案——不是 API 写错,而是平台能力根本不同。
App 端(Android/iOS/HarmonyOS)必须三步全到位
缺任何一环都会静默失败,连错误回调都不触发:
- iOS:
manifest.json中plus → distributors → ios → permissions下必须有microphone,且NSMicrophoneUsageDescription字符串不能为空(为空会冷启动闪退) - Android:
module.json5必须声明"android.permission.RECORD_AUDIO",运行时还要主动调uni.authorize({scope: 'scope.record'}) - 录音结束后,
onStop返回的res.tempFilePath是临时路径,必须立刻用uni.saveFile()持久化,否则重启后打不开 - 别设
duration超过 60000(60 秒),部分 Android 厂商 ROM 会直接拒绝长时录音
微信小程序端不能用 uni.getRecorderManager()
它在小程序环境里是空对象,调用 start() 会报 undefined is not a function。必须改用官方 wx.getRecorderManager():
- 先在
app.json里加"requiredPrivateInfos": ["record"] - 权限检查要走
wx.getSetting+wx.authorize({scope: 'scope.record'}) - 录音参数中
format: 'mp3'兼容性最好,但 iOS 实际输出可能是 AAC 封装的 MP3;sampleRate: 16000足够语音识别,文件更小 - 注意:微信禁止后台录音,页面切到后台时录音会自动中断,无法恢复
H5 端得用 navigator.mediaDevices.getUserMedia + MediaRecorder
uni.getRecorderManager() 在浏览器里根本不存在,强行调用会报 undefined:
- 必须由用户手势(如点击按钮)触发
getUserMedia({audio: true}),Safari 和部分安卓浏览器不支持自动授权 -
MediaRecorder输出格式取决于浏览器:Chrome 支持audio/webm,Safari 只支持audio/mp4(AAC),不能硬写mp3 - 录制结束生成的是
Blob,需转成 URL 才能播放:URL.createObjectURL(blob),别直接赋值给的src - 若要上传,推荐转成
FormData发送,避免 Base64 膨胀 33%
最容易被忽略的是:iOS 上 NSMicrophoneUsageDescription 为空、Android 缺 RECORD_AUDIO 声明,这两处配置错误不会报 JS 错误,只会在打包后彻底失灵——必须人工核对 manifest 文件,不能等运行时才发现。











