uni.getrecordermanager必须同时监听touchstart、touchend和touchcancel三事件,缺一不可;touchmove也需监听以支持滑动取消;状态变量isrecording须在touchstart立即设true,并在所有stop/error路径强制置false。

uni.getRecorderManager 必须配合 touchcancel 才能真正可靠
只监听 touchstart 和 touchend 会导致 iOS 微信里录音经常静音或失败——手指滑出按钮、弹窗出现、切后台都会触发 touchcancel,但很多人没监听它,结果 recorder 还在后台跑,下次点就报 “fail recorder is running”。
- 三个事件缺一不可:
touchstart启动录音,touchend停止并上传,touchcancel必须调recorder.stop()并重置状态 -
touchmove也要监听:当手指横向滑出按钮区域(比如向左滑动取消),立刻recorder.stop()并更新 UI 提示“松开取消” - 状态变量
isRecording不能靠事件回调设,得在touchstart立刻设为true,并在所有 stop/error 路径里强制设回false
采样率和声道选错,文件体积直接翻倍
默认 recorder.start() 输出 PCM,1 秒 ≈ 16KB;录满 60 秒就是 1MB+,上传慢、后端转码压力大。微信语音实际用的是 AMR 或 Speex,uni-app 前端不支持直接输出,只能靠参数压。
由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下 这篇入门教程将引导你完成如下任务: 创建百度云平台应用启用微信公众平台开发模式获取订阅、文字、图片、语音、视频消息回复文本、图文及音乐消息程序开发
- 必须设
sampleRate: 16000—— 语音识别够用,再高无意义,还增大体积 - 必须设
numberOfChannels: 1(单声道)—— 双声道直接翻倍,且人声几乎无差异 -
duration是软限制,某些 Android 机型不生效;要用setTimeout主动中断:this.timer = setTimeout(() => recorder.stop(), 60000),并在onStop回调里clearTimeout(this.timer)
iOS 微信里 tempFilePath 不能直接播放
拿到的 tempFilePath 在 iOS 微信中是 file:// 协议路径,uni.createInnerAudioContext().src 会报 invalid file path;Android 和 App 端可直接播,H5 根本不支持录音 API。
- 播放前先判断路径:
if (!tempFilePath.startsWith('http')),如果不是 HTTP 地址,说明还没上传,别创建 audio 上下文 - iOS 必须走
uni.uploadFile上传到服务端,返回 HTTP URL 后再赋给innerAudioContext.src - 不要尝试用
uni.getFileSystemManager().readFile读取临时路径——iOS 权限拒绝,且 PCM 数据无法直接播放 - H5 环境完全不支持
uni.getRecorderManager,需降级为recorder-core+ Web Audio API,输出 MP3 blob
授权失败不报错,但后续全挂
uni.authorize({scope: 'scope.record'}) 在 iOS 微信里不弹框就直接失败,控制台也无错误提示,后续所有 recorder.start() 都静默失败。
- 必须在
touchstart前主动调用授权,并用catch捕获失败:uni.authorize(...).catch(() => uni.openSetting()) - Android 真机(尤其华为 EMUI)可能因省电策略杀掉录音进程,建议
touchstart同时调uni.showLoading({title: '录音中...'}),防止用户松手过早 - 录音结束务必用
uni.getFileInfo({filePath})检查文件大小,避免用户录了 5 分钟才发现上传超限










