From 656dfabb29127db2539359ba41b8376cad49e92e Mon Sep 17 00:00:00 2001 From: yuzhiran Date: Sun, 5 Jul 2026 09:32:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20interview=20=E5=BD=95=E9=9F=B3=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E9=95=BF=E6=8C=89=E6=8C=89=E4=BD=8F=E5=BD=95=E9=9F=B3?= =?UTF-8?q?=E6=9D=BE=E5=BC=80=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit startRecord 先同步设 isRecording=true 再异步 uni.authorize,避免 touchend 在 authorize success 回调前就触发 stopRecord 导致录音没 来得及开始就被停止。 移除冗余 doStartRecorder 函数,inline 到 authorize success 回调中。 stopRecord 不再检查 isRecording 守卫(可能已被 startRecord 设为 true), 直接 recorder.stop()。 --- zhiyin-app/src/pages/interview/interview.vue | 42 ++++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/zhiyin-app/src/pages/interview/interview.vue b/zhiyin-app/src/pages/interview/interview.vue index c581926..915a933 100644 --- a/zhiyin-app/src/pages/interview/interview.vue +++ b/zhiyin-app/src/pages/interview/interview.vue @@ -401,11 +401,27 @@ function startRecord() { if (aiLoading.value || isComplete.value) return // #ifdef MP-WEIXIN if (isRecording.value) return - // 先确保已获得 scope.record 授权,避免没权限时产生全 0 的 corrupted 音频 + // 先标记正在录音,避免 touchend 在 authorize 回调前就触发 stopRecord + isRecording.value = true uni.authorize({ scope: 'scope.record', - success: () => doStartRecorder(), + success: () => { + if (!recorder) initRecorder() + if (!recorder) { + isRecording.value = false + uni.showToast({ title: '录音初始化失败', icon: 'none' }) + return + } + recorder.start({ + format: 'wav', + sampleRate: 16000, + numberOfChannels: 1, + encodeBitRate: 128000, + }) + uni.vibrateShort({ type: 'medium' }) + }, fail: () => { + isRecording.value = false uni.showModal({ title: '需要录音权限', content: '请在「设置」中开启「麦克风」权限后再使用语音输入', @@ -416,32 +432,14 @@ function startRecord() { }) // #endif // #ifndef MP-WEIXIN + isRecording.value = false uni.showToast({ title: '语音输入仅支持小程序', icon: 'none' }) // #endif } -// #ifdef MP-WEIXIN -function doStartRecorder() { - isRecording.value = true - if (!recorder) initRecorder() - if (!recorder) { - isRecording.value = false - uni.showToast({ title: '录音初始化失败', icon: 'none' }) - return - } - recorder.start({ - format: 'wav', - sampleRate: 16000, - numberOfChannels: 1, - encodeBitRate: 128000, - }) - uni.vibrateShort({ type: 'medium' }) -} -// #endif - function stopRecord() { - if (!recorder || !isRecording.value) return isRecording.value = false + if (!recorder) return recorder.stop() }