From 41d98dd275dcbfdae180be6341d8e7ca46f4beae Mon Sep 17 00:00:00 2001 From: crosswk Date: Wed, 29 Jul 2026 20:40:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=BA=A6=E5=85=8B=E9=A3=8E?= =?UTF-8?q?=E5=90=8D=E5=AD=97=E4=B8=BA=E7=A9=BA=EF=BC=9A=E5=9C=A8=E9=9F=B3?= =?UTF-8?q?=E9=A2=91=E6=B5=81=E6=B4=BB=E8=B7=83=E6=97=B6=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=E8=AE=BE=E5=A4=87(WebView2=E8=87=AA=E5=8A=A8=E6=94=BE=E8=A1=8C?= =?UTF-8?q?=E4=B8=8B=E6=9D=83=E9=99=90=E4=B8=8D=E6=8C=81=E4=B9=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/services/audio.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/src/services/audio.ts b/client/src/services/audio.ts index 6a95e35..80b3979 100644 --- a/client/src/services/audio.ts +++ b/client/src/services/audio.ts @@ -140,12 +140,17 @@ export async function listMicrophones(): Promise { // 先申请一次权限(用完立刻关闭),再重新枚举,才能拿到系统里所有麦克风及其名称。 const needPermission = devices.length === 0 || devices.every((d) => !d.label) if (needPermission) { + let stream: MediaStream | null = null try { - const stream = await navigator.mediaDevices.getUserMedia({ audio: true }) - stream.getTracks().forEach((t) => t.stop()) + stream = await navigator.mediaDevices.getUserMedia({ audio: true }) + // 关键:必须在音频流仍活跃时枚举,才能拿到设备名字。 + // WebView2 的 --auto-accept-camera-and-microphone-capture 下权限不持久, + // 流一旦停止,enumerateDevices() 的 label 又会变空。 devices = audioInputs(await navigator.mediaDevices.enumerateDevices()) } catch { // 权限被拒或设备不存在:保留已有结果(可能只有通用项) + } finally { + if (stream) stream.getTracks().forEach((t) => t.stop()) } }