From ae77c69fe9d81e2bda9e4e6beffc26484c19ad66 Mon Sep 17 00:00:00 2001 From: zhoulinf <2507241354@qq.com> Date: Tue, 4 Aug 2026 17:57:26 +0800 Subject: [PATCH] =?UTF-8?q?CRM=5F26-08-05#story#9126,=E8=BD=A6=E8=BE=86?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E3=80=81=E6=9C=8D=E5=8A=A1=E5=95=86=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=B3=BB=E7=BB=9F=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/CameraGuide.vue | 4 +-- src/views/index/vehicleAdd.vue | 56 ++++++++++++++++++++-------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/components/CameraGuide.vue b/src/components/CameraGuide.vue index f950d6e5..ff039889 100644 --- a/src/components/CameraGuide.vue +++ b/src/components/CameraGuide.vue @@ -203,8 +203,8 @@ export default { } } catch (e) { // 权限拒绝或相机不可用 → 通知父组件降级为系统选择器 - console.error('getUserMedia error:', e) - this.$emit('fallback') + console.warn('getUserMedia error:', e && (e.name || e.message || e)) + this.$emit('fallback', e) } }, stopCamera() { diff --git a/src/views/index/vehicleAdd.vue b/src/views/index/vehicleAdd.vue index a7c8f43f..a6067108 100644 --- a/src/views/index/vehicleAdd.vue +++ b/src/views/index/vehicleAdd.vue @@ -959,14 +959,37 @@ export default { stream.getTracks().forEach(t => t.stop()) this.cameraGuideVisible = true } catch (e) { - console.error('probe getUserMedia error:', e) - if (e && (e.name === 'NotAllowedError' || e.name === 'SecurityError')) { - // 权限被拒:弹框询问(重试/从相册选择) - this.onCameraFallback() - } else { - // 无摄像头、被占用等其他异常:直接降级系统选择器 - this.triggerNativeUpload(type) - } + console.warn('probe getUserMedia error:', e && (e.name || e.message || e)) + this.handleCameraFail(e) + } + }, + isCameraPermissionError(e) { // 是否为相机权限类错误 + return !!(e && (e.name === 'NotAllowedError' || e.name === 'SecurityError' || e.name === 'PermissionDeniedError')) + }, + handleCameraFail(e) { // 相机不可用统一处理:权限类弹确认框,其他异常提示后由用户点击触发相册(保证点击手势有效) + this.cameraGuideVisible = false + if (this.isCameraPermissionError(e)) { + Dialog.confirm({ + title: '提示', + message: '相机权限未开启,无法使用拍摄引导。是否重新尝试开启相机?', + confirmButtonText: '重新尝试', + cancelButtonText: '从相册选择', + confirmButtonColor: '#354D93', + }).then(() => { + // 重新走前置探测,探测通过才打开拍摄引导 + this.onLicenseSlotClick(this.cameraGuideType) + }).catch(() => { + this.triggerNativeUpload(this.cameraGuideType) + }) + } else { + Dialog.alert({ + title: '提示', + message: '当前设备无法调用相机拍摄,请从相册选择照片上传。', + confirmButtonText: '从相册选择', + confirmButtonColor: '#354D93', + }).then(() => { + this.triggerNativeUpload(this.cameraGuideType) + }) } }, triggerNativeUpload(type) { // 主动触发对应 uploader 的原生文件选择 @@ -999,21 +1022,8 @@ export default { onCameraCancel() { // 返回放弃 this.cameraGuideVisible = false }, - onCameraFallback() { // 权限拒绝/相机不可用:弹框询问,重试或降级系统选择器 - this.cameraGuideVisible = false - Dialog.confirm({ - title: '提示', - message: '相机权限未开启,无法使用拍摄引导。是否重新尝试开启相机?', - confirmButtonText: '重新尝试', - cancelButtonText: '从相册选择', - confirmButtonColor: '#354D93', - }).then(() => { - // 重新走前置探测,探测通过才打开拍摄引导 - this.onLicenseSlotClick(this.cameraGuideType) - }).catch(() => { - // 降级为系统选择器 - this.triggerNativeUpload(this.cameraGuideType) - }) + onCameraFallback(e) { // CameraGuide 内 getUserMedia 失败(前置探测已通过,概率极低):按异常类型统一处理 + this.handleCameraFail(e) }, async vehicleLicenseFrontHandler(file) { // 上传 行驶证首页 console.log('file',file)