app端使用uni.getrecordermanager()需权限、配置、保存三步全到位:ios须在manifest.json中配置microphone权限及非空nsmicrophoneusagedescription,android须在module.json5声明record_audio权限并运行时调用uni.authorize申请,录音后必须用uni.savefile保存至持久路径,否则临时文件会被清理。
app端能用 uni.getrecordermanager(),但必须权限、配置、保存三步全到位;h5和小程序不能直接用它调原生麦克风——h5得走 navigator.mediadevices.getusermedia + mediarecorder,小程序则受限于平台策略(比如微信禁止后台录音)。
App端权限不弹窗或静默失败,怎么查?
这不是 JS 调用问题,而是 manifest 配置 + 运行时申请双缺失导致的:
- iOS:manifest.json 的
plus → distributors → ios → permissions下必须有microphone,且NSMicrophoneUsageDescription字符串不能为空(否则冷启动直接闪退) - Android:
module.json5中必须声明"android.permission.RECORD_AUDIO",缺了 start() 就会静默失败 - 运行时要用
uni.authorize({scope: 'scope.record'}),但如果用户点过“拒绝”,这个 API 再也不会弹窗——此时得调permision.gotoAppPermissionSetting()跳转系统设置页(需引入插件市场「App权限判断和提示」)
录音参数选 mp3 还是 aac?
优先选 aac,尤其 HarmonyOS NEXT 和 iOS:
-
format: 'aac'+sampleRate: 32000是当前最稳组合,MP3 在部分 Android 机型上会触发编码异常导致文件损坏 - 单声道就够了:
numberOfChannels: 1,兼容性更好,文件体积更小 - 别设
duration超过 60 秒——某些厂商 ROM 对长时间录音有硬限制,start() 可能直接报错
录音文件路径为什么一重启就打不开?
因为 onStop 返回的 res.tempFilePath 是临时路径,系统随时可能清理。必须主动保存:
- 用
uni.saveFile({tempFilePath: res.tempFilePath}),它会把文件移到uni.env.USER_DATA_PATH下,路径稳定、可分享、不被自动清理 - 千万别用
fs.copyFile直接操作tempFilePath——部分 Android 厂商限制访问沙箱外路径,且tempFilePath可能是content://URI 格式,copyFile不识别 - 保存后立即调
uni.getFileInfo({filePath: savedPath})校验文件大小,避免空文件(常见于权限没真正生效就调了start())
最容易被忽略的是:iOS 上 NSMicrophoneUsageDescription 字符串为空,App 会冷启动闪退,连错误日志都不抛;而 Android 缺 RECORD_AUDIO 权限声明,start() 就静默失败,没有任何提示——这两处必须在打包前人工核对 manifest 配置,不能只依赖运行时检查。











