diff --git a/src/renderer/src/components/CameraCapture.vue b/src/renderer/src/components/CameraCapture.vue index c173567..3165284 100644 --- a/src/renderer/src/components/CameraCapture.vue +++ b/src/renderer/src/components/CameraCapture.vue @@ -18,6 +18,10 @@ const capturedDataUrl = ref('') const starting = ref(false) const errorMessage = ref('') +// 真机实测确认的后置摄像头(朝外拍摄那颗)标签是 "Hy-8M(8079)-Camera", +// 用型号里的数字串匹配,不依赖完整标签文案(避免语言环境/固件版本差异导致匹配不上) +const REAR_CAMERA_LABEL_HINT = '8079' + let stream: MediaStream | null = null function stopStream(): void { @@ -58,6 +62,10 @@ async function refreshDevices(): Promise { } } +function findRearCamera(): MediaDeviceInfo | undefined { + return devices.value.find((d) => d.label.includes(REAR_CAMERA_LABEL_HINT)) +} + async function switchDevice(deviceId: string): Promise { selectedDeviceId.value = deviceId emit('deviceChange', deviceId) @@ -109,8 +117,16 @@ watch( if (val) { capturedDataUrl.value = '' selectedDeviceId.value = props.initialDeviceId - await refreshDevices() + // 摄像头 label 在拿到权限前是空的(浏览器隐私限制),没法在这一步就按标签 + // 找后置摄像头,先随便开一个拿到权限;startStream 成功后 devices 里才有真实 label。 await startStream(selectedDeviceId.value) + // 用户/配置没有指定具体摄像头时,权限到手后尝试切到确认过的后置摄像头 + if (!props.initialDeviceId) { + const rear = findRearCamera() + if (rear && rear.deviceId !== selectedDeviceId.value) { + await switchDevice(rear.deviceId) + } + } } else { stopStream() }