不能。uni.scanCode仅调起系统级扫码界面,不支持实时预览、自定义UI或连续识别;需实时扫码应使用原生插件如uni-plugin-qrcode-scanner,纯JS方案(camera+jsqr)在iOS App中因WebKit限制无法截帧,仅H5可行。

uni-app 中 uni.scanCode 能否直接调用摄像头识别二维码?
不能。uni.scanCode 是封装好的扫码 API,它会自动拉起原生扫码界面(iOS/Android 各自的系统级扫码视图),不暴露摄像头控制权,也不支持持续扫描、自定义框线或识别结果回调后继续捕获画面。
如果你需要「实时摄像头预览 + 动态识别二维码」(比如扫商品码时连续识别、失败后立即重试、叠加 UI 提示),uni.scanCode 不适用——必须换方案。
替代方案:用 uni.createCameraContext + 第三方解码库
核心思路是:用 camera 组件显示实时画面 → 用 uni.createCameraContext 截帧 → 将图像转为 base64 或 Canvas 数据 → 交由 JS 解码库(如 jsqr)识别。
-
jsqr是轻量、纯 JS 的 QR 码解码器,兼容 H5、App(需注意 iOS App 下 canvas 截图权限)和小程序(部分平台受限) - 仅支持 QR Code,不支持条形码(如 Code128、EAN-13);如需多码制,得换
quaggaJS(但体积大、H5 可用,App 端兼容差)或原生插件 - 安卓真机上帧率尚可;iOS 真机需确保
camera组件device-position="back"且flash="off",否则截图常为空白
关键坑:canvas 截图在 iOS App 下返回空数据
这是最常卡住的点。uni-app 的 uni.canvasToTempFilePath 在 iOS App 环境中,对 camera 输出的 canvas 截图大概率返回空或黑图,根本原因是 iOS 原生限制:摄像头画面无法直接绘入 canvas(除非通过 video 元素 + drawImage,但 uni-app 的 camera 不提供 video DOM 引用)。
可行解只有两个:
- 改用
uni.getRecorderManager().start()+ 视频流截帧(不现实,API 不支持) - 放弃纯前端解码,接入原生插件 —— 推荐使用 DCloud 官方维护的
uni-plugin-qrcode-scanner(已适配 iOS/Android),它在原生层调用摄像头并实时解码,通过onDecode回调返回结果,稳定且低延迟
如果坚持用纯 JS 方案,H5 环境下怎么写?
只适用于 H5(浏览器环境),代码结构清晰:
<template>
<view class="scanner">
<camera device-position="back" @error="onError"></camera>
<canvas canvas-id="qrcodeCanvas" class="hidden"/>
</view>
</template>
<script>
import jsQR from 'jsqr';
export default {
methods: {
startScan() {
const ctx = uni.createCanvasContext('qrcodeCanvas', this);
// 每 300ms 截一帧(避免性能过载)
this.interval = setInterval(() => {
ctx.draw(false, () => {
uni.canvasToTempFilePath({
canvasId: 'qrcodeCanvas',
success: (res) => {
const img = new Image();
img.onload = () => {
const code = jsQR(img.getContext('2d').getImageData(0, 0, img.width, img.height));
if (code) {
console.log('识别到:', code.data);
clearInterval(this.interval);
}
};
img.src = res.tempFilePath;
}
});
});
}, 300);
}
}
}
</script>
注意:canvas 必须与 camera 尺寸一致且隐藏(class="hidden"),否则截图尺寸错乱;jsqr 输入必须是灰度图像数据,实际使用时建议加 grayscale: true 预处理逻辑(需自行实现 canvas 灰度转换)。
真正上线的 App 项目,别碰这个纯 JS 路子。iOS 上的 canvas 截图限制不是 bug,是 WebKit 的安全策略,绕不过去。


















