更新记录
1.0.0(2025-08-23)
初始版本1.0.0
1、支持外置USB摄像头,内置摄像头。
2、支持拍照。
平台兼容性
uni-app(4.07)
Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ | √ | √ |
微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 |
---|---|---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
uni-app x(4.07)
Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ |
1、使用:
<smart-camera id="cameraView" class="cameraview" @initDone="handleCameraDone" @error="handleCameraError"></smart-camera>
2、拍照:调用takePicture()方法
takePicture: function () {
let context = createSmartCameraContext("cameraView")
// context?.takePicture(result => { console.log("takePicture----------success:" + result.success + " message:" + result.message + " uri:" + result.uri) })
context?.takePicture(result => {
console.log("takePicture callback:", JSON.stringify(result));
// 1. 将可能为 null 的 uri 属性值赋给一个局部常量
const imageUri = result.uri;
if (result.success && imageUri != null) {
uni.showToast({
title: "拍照成功",
icon: "success"
});
// 【【【【【 关键:将返回的 uri 赋值给 imageSrc 】】】】】
// result.uri 是一个本地文件路径,可以直接用于 <image> 组件的 src
this.imageSrc = imageUri;
} else {
uni.showToast({
title: `拍照失败: ${result.message}`,
icon: "error"
});
// 拍照失败时可以清空旧照片
this.imageSrc = '';
}
});
},
3、回调摄像头变化状态方法:
initDone:表示已连接或连接中的状态 返回以json数据结构
如:{"code":0,"msg":"正在使用内置摄像头"}
{"code":1,"msg":"正在连接外置摄像头"}
error:表示连接失败或断开的状态 返回以json数据结构
如: {"code":-1,"msg":"外置摄像头已拔出"}
// 摄像头连接正确
function handleCameraDone(statusData : UTSJSONObject) {
const code = statusData.get("code") as number | null ?? 0;
const msg = statusData.get("msg") as string | null ?? "";
if (code == 0) {
console.log("🚀 ~ cameraView", "已连接...")
} else if (code == 1) {
// 在这里处理错误状态,例如弹窗提示
console.log("🚀 ~ cameraView", "连接中...")
}
}
// 摄像头连接错误
function handleCameraError(statusData : UTSJSONObject) {
if (statusData.get("code") == -2) {
//提示插拔一下
uni.showToast({
title: `连接失败,请尝试重新拔插摄像头!`,
icon: 'none'
});
}
//失败后尝试再打开一次,这里只尝试一次
if (status_handOpenCamera.value == false) {
status_handOpenCamera.value = true
handOpenCamera()
}
}
4、手动打开摄像头:
function handOpenCamera() {
const smartCameraContext = createSmartCameraContext("cameraView")
smartCameraContext?.initCamera(callback => {
console.log("手动打开摄像头返回", callback)
})
}
注意:
1、使用组件时,会自动打开摄像头。如打开失败,也可通过手动打开,调用initCamera方法。
2、在有内置和外置摄像头同时存在的情况下,会优先使用外置。如果没有外置摄像头则会使用内置,如手机。外置摄像头适用于特殊设备。
3、在使用内置摄像头时,默认使用的前置摄像头。