更新记录
3.0.0(2026-10-22) 下载此版本
新增
- Android CameraX + ML Kit、iOS AVFoundation + ML Kit 实时原生扫码引擎
- App 镜头同帧多码、定格选择、动态多码和按实际位置显示的结果标记
- App/H5 图片多码识别,默认按引擎实际结果返回,不限制数量
- App 原生增强相机连续自动对焦、双指缩放、手动变焦与点按对焦
- App 标准相机和 H5 自动变焦
getScanCapabilities()码制及功能能力查询,不支持码制通过fail明确返回- 标题、提示、主题色、工具栏项目/顺序/文案及扫码页区域插槽自定义
- URL 打开、系统分享、拨号、WiFi 连接、地图导航、邮件、短信和复制等结果动作
- H5 实时多码、摄像头枚举与切换、闪光灯、截图、自定义解码器
优化
- 插件统一迁移到
uni_modules/lf-scan,组件、扫码页、原生引擎、静态资源和文档一次导入 - 多码使用无暗角遮罩的全屏界面,识别后可定格画面,也可保持实时跟踪
- Android 多码坐标按分析帧旋转、裁剪区域和全屏预览规则映射
- 动态多码增加短时结果稳定窗口,降低正常手持抖动造成的标记闪烁
- 默认一维码仅启用 EAN-13、UPC-A、Code 128;其他一维码按需显式开启
- 扫码页面、示例页面、操作文案和返回键行为统一整理
修复
- 修复 App 非系统扫码页按系统返回键无法退出
- 修复 Android 多码页面点击结果时崩溃
- 修复多码标记停留在已移出画面的码位置
- 修复图片或预览缩放造成的多码标记坐标偏移
- 修复设备倾斜或旋转后分析帧方向变化造成的多码标记错位
- 修复 CameraX 分析裁剪区域原点未换算造成的多码箭头偏移
- 修复
RSS_14、RSS_EXPANDED等当前引擎不支持且设置页无法取消时阻止启动 - 修复非 App 环境直接访问
plus导致的运行错误 - 补充系统扫码、标准相机、原生增强相机和 H5 的功能边界说明
2.0.0(2026-09-23) 下载此版本
2.0.0(2026-09-23)最终版本
2.0.0 是 lf-scan 的最终版本,后续不再更新。持续维护与新功能转向 uni-app x / UTS 版本 lf-scan-x(开发中)。
修复
- 修复自定义界面识别二维码需要数秒:
barCode默认集合去掉 EAN-8 / UPC-E,避免其假读数每帧抢占识别并反复停止扫描;需要短条码时显式传入ean8/upce - 修复连续扫码去重窗口被重复读数不断刷新、到期后不重置的问题;去重改为默认关闭(
dedupeTime为 0),每次读到都视为新结果 - 修复原生以字符串形式返回数值码型(如
"1")时码型被识别为未知的问题 - 修复连续扫码只有第一次播放提示音:App 端
innerAudioContext停止后再播放无声,改为每次新建上下文、播完即销毁 - 修复识别结果错乱、连续扫码"震动多次但结果全错 / 只剩一个字符":
barCode不再包含 Code39 / ITF / Codabar / RSS 等无校验位码型,新增一维码二次确认与最小长度校验,原生识别事件按最长字符串字段取内容,系统扫码页对可疑码型自动重扫 - 修复震动 / 提示音开关无效:原生控件的震动 / 提示音关闭,改由组件统一控制,去重时不重复反馈
- 修复 App nvue 自定义界面多种场景黑屏:相机重复初始化、
barcode无显式尺寸、无相机权限、切后台回前台未恢复、闪光灯误拉起系统相机、停止时先销毁后cancel - 修复快速连续点击导致重复调用
uni.scanCode - 修复
filters与码型名称映射和plus.barcode常量不一致 - 修复 nvue 下闪光灯状态被两次取反无法关闭
新增
- 插件自带全屏扫码页
uni_modules/lf-scan/pages/scan/scan.nvue,App vue 页面一行调用即可使用自定义界面(pages.json 注册一次,未注册自动回退系统扫码页) - 迁移为
uni_modules规范,easycom 自动引入,HBuilderX 一键发布 mode:auto/api/custom- 识别成功提示音(内置音效,
sound/soundSrc) - 自动放大
autoZoom(App 原生 / 系统扫码页 / H5 中心区域放大识别),H5 双指缩放与setZoom() - 一维码二次确认
verifyBarcode,barCodeAll码型 - 连续扫码
continuous/continuousInterval/dedupeTime,底部实时显示已识别数量与最新内容(showResult) - H5 支持:
getUserMedia+BarcodeDetector,支持h5Decoder接入 jsQR / zxing,支持闪光灯 - 相机权限预检与设置页引导,
fail事件增加type - 结果解析
result.parsed:网址 / WiFi / vCard / MECARD / 日程 / 电话 / 短信 / 邮件 / 地理位置 / 商品条码 / JSON - 方法:
pause()、resume()、cancel()、setFlash()、toggleFlash()、setZoom()、scanImage(path)、isScanning() - 事件:
start、stop、flash-change - 属性:
color、showHeader、showFlash、showTrigger、triggerText、showResult、autoStart、vibrate、sound、soundSrc、verifyBarcode、parse、permissionTip、safeAreaTop、pagePath、zIndex、debug、autoCharset、barCodeInput、h5* - 内置纯 view 绘制的图标,无字体 / 图片依赖
- 工具函数入口
index.js:parseScanResult、createScanHistory、checkCameraPermission、playSound等
变更
- 组件目录由
components/lf-scan迁移至uni_modules/lf-scan auto模式在 App vue 页面默认跳转插件扫码页(1.x 为系统扫码页),需要系统扫码页请设置mode="api"autoStart语义变更为「组件挂载后自动开始扫码」,默认falseautoCharset默认false(与uni.scanCode一致)success回调新增source、platform、timestamp、parsed,scanType统一为大写下划线命名startScan()/stopScan()保留为别名
1.0.0
- 首个版本:App / 小程序扫码,nvue 自定义界面,闪光灯、相册识别、保存图片
1.0.0(2025-12-22) 下载此版本
查看更多平台兼容性
uni-app(5.26)
| Vue2 | Vue3 | Chrome | Chrome插件版本 | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | 2.0.0 | × | √ | √ | √ | √ | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | - | - | - | - | - | - | - | - | - | - | - |
lf-scan 全平台扫码与多码识别
lf-scan 是面向经典 uni-app(Vue2 / Vue3)的二维码、条形码扫描组件。插件内置 easycom 组件、全屏扫码页、Android/iOS 原生识别引擎与结果处理工具,一次导入即可覆盖 App、H5、微信 / 支付宝 / 百度 / 抖音 / QQ 小程序,无需再安装任何第三方扫码依赖。
📌 新项目建议使用
lf-scan-xuni-app x(UTS / uvue)是 DCloud 官方未来的主推方向。新建项目、新功能建议直接选用
lf-scan-x(本插件的 uni-app x 版,插件市场搜索即可);已有的经典 uni-app(Vue2 / Vue3)项目可继续使用本插件。
核心特性
| 能力 | 说明 |
|---|---|
| 🎯 同帧多码识别 | 单帧画面同时识别多个二维码 / 条形码,按码在画面中的真实位置叠加选择标记,点击即取 |
| 🖼️ 图片多码识别 | 相册选图或传入本地图片路径,一次识别出图中全部码,App / H5 均支持 |
| 🧊 定格 + 动态双多码模式 | 定格模式画面稳定、标记精准;动态模式实时跟踪,码移出画面自动消失 |
| 📷 原生识别引擎 | Android CameraX + ML Kit、iOS AVFoundation + ML Kit 实时引擎,非 uni.scanCode 包装 |
| 🔍 原生级相机控制 | 连续自动对焦、点按对焦、双指缩放、setZoom() / focusAt()、闪光灯、前后镜头切换 |
| 🔁 连续逐个扫描 | 间隔可调、结果去重,适合仓库盘点、批量录入 |
| 🧩 深度 UI 定制 | 主题色、标题、提示、工具栏按钮的顺序 / 文案 / 图标 / 颜色 / 尺寸,以及 5 个区域插槽 |
| 🔗 内容智能解析 | URL、WiFi、电话、邮件、短信、vCard、MeCard、日程、地理位置、JSON 等 12 类内容自动识别 |
| ⚡ 一键结果动作 | 复制、分享、打开网址、拨号、连接 WiFi、导航、发邮件、发短信,外部动作自动二次确认 |
| 🛰️ 运行时能力查询 | getScanCapabilities() 返回引擎、码制与功能能力,不支持的码制通过 fail 明确反馈 |
| 🌐 全平台覆盖 | App(Vue / nvue)、H5(Chrome / Edge / Safari)、微信 / 支付宝 / 百度 / 抖音 / QQ 小程序 |
| 📦 零依赖 · 极轻量 | 纯原生 API 与手写算法实现,无第三方依赖、无广告、无埋点,MIT 开源免费 |
安装配置
1. 导入插件
在插件市场选择「使用 HBuilderX 导入插件」,插件目录应为 uni_modules/lf-scan/。组件符合 easycom 规范,无需手动 import 或注册。
2. 注册 App 扫码页
导入时确认合并插件的 pages_init.json。若未自动合并,在项目 pages.json 的 pages 中加入:
// #ifdef APP-PLUS
,
{
"path": "uni_modules/lf-scan/pages/scan/scan",
"style": {
"navigationStyle": "custom",
"backgroundColor": "#000000",
"app-plus": {
"bounce": "none",
"titleNView": false
}
}
}
// #endif
pages 数组第一项后使用上述片段时保留开头逗号;扫码页是第一项则删除逗号。未注册页面时,App Vue 页面会回退到系统扫码页。
3. 配置 App 模块与权限
在 manifest.json 中勾选 Barcode(扫码) 与 Camera(相机) 模块,并配置相机、相册权限描述。Android 至少声明:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
iOS 至少配置:
{
"NSCameraUsageDescription": "用于识别二维码和条形码",
"NSPhotoLibraryUsageDescription": "用于从相册选择图片识别二维码",
"NSPhotoLibraryAddUsageDescription": "用于保存扫码截图到相册"
}
连接 WiFi 还需要 Android 的 WiFi、网络状态、定位及 Android 13 NEARBY_WIFI_DEVICES 权限;iOS 需要 com.apple.developer.networking.HotspotConfiguration entitlement。示例工程的 manifest.json 已包含完整配置。
4. 制作自定义基座
插件包含 UTS 原生依赖。首次导入、更新原生代码或修改权限后,需要使用 HBuilderX 4.71+ 重新制作自定义调试基座。Android 最低 API 21(Android 5.0);iOS 原生依赖要求 deployment target 15.5。
快速开始
<template>
<lf-scan ref="scan" :show-trigger="false" @success="onSuccess" @fail="onFail" />
</template>
<script>
export default {
methods: {
openScan() {
this.$refs.scan.start();
},
onSuccess(result) {
console.log(result.result, result.scanType, result.parsed);
},
onFail(error) {
console.log(error.type, error.errMsg);
}
}
};
</script>
不同宿主的行为:
- App Vue 页面:进入插件自带的全屏扫码页。
- App nvue 页面:在当前页面内显示扫描视图。
- H5:使用浏览器摄像头(需 HTTPS 或 localhost)。
- 小程序:调用各平台
uni.scanCode系统扫码页。
平台能力
| 平台 | 自定义扫码页 | 实时多码 | 图片多码 | 变焦/对焦 | 说明 |
|---|---|---|---|---|---|
| App Android | 支持 | 支持 | 支持 | 支持 | Android 5.0+;原生能力需重新制作自定义基座 |
| App iOS | 支持 | 支持 | 支持 | 支持 | iOS deployment target 15.5+;需重新制作自定义基座 |
| H5 Chrome/Edge | 支持 | 取决于解码器 | 取决于解码器 | 支持缩放 | 需要 HTTPS 或 localhost |
| H5 Safari | 需自定义解码器 | 取决于解码器 | 取决于解码器 | 支持数字缩放 | Safari 无原生 BarcodeDetector 时传入 h5Decoder |
| 微信/支付宝/百度/抖音/QQ 小程序 | 系统扫码页 | 不支持 | 不支持 | 由平台控制 | 使用 uni.scanCode,一次返回一个结果 |
系统扫码页由运行平台实现,界面、手动变焦、点按对焦、多码选择和完全自定义工具栏不受组件控制。需要这些能力时,App 使用默认自定义页并开启 nativeCamera,H5 使用默认浏览器扫码界面。
模式与引擎
mode 如何选择引擎
| 配置或平台 | 实际行为 |
|---|---|
App Vue + mode="auto" |
打开插件自带的全屏 scan.nvue 页面 |
App nvue + mode="auto" / custom |
在当前 nvue 页面显示扫码界面 |
App + mode="api" |
调用 uni.scanCode 系统扫码页 |
| H5 | 使用浏览器相机;mode 不会切换到 uni.scanCode |
| 小程序 | 调用各平台的 uni.scanCode,不提供插件自定义相机界面 |
App + nativeCamera=false + 单码/连续扫描 |
使用 DCloud barcode 标准相机 |
App + nativeCamera=true |
单码和连续扫描使用 CameraX/AVFoundation 原生增强相机 |
App + multiple=true |
无论 nativeCamera 如何设置,实时多码固定使用原生增强相机 |
mode="custom" 只表示使用插件自定义扫码界面。经典 uni-app 的 Vue 页面仍会打开插件的 nvue 扫码页;只有宿主本身是 nvue 页面时才在当前页内显示。
相机能力对照
| 功能 | 系统扫码 api |
App 标准相机 | App 原生增强相机 | H5 相机 |
|---|---|---|---|---|
| 单码扫描 | 支持 | 支持 | 支持 | 支持 |
| 连续逐个扫描 | 不支持 | 支持 | 支持 | 支持 |
| 实时多码选择 | 不支持 | 不支持 | 支持 | 取决于 BarcodeDetector 或 h5Decoder |
| 定格多码 / 动态多码 | 不支持 | 不支持 | 支持 | 支持;取决于解码器是否返回位置 |
| 连续自动对焦 | 由系统控制 | 由 barcode 和设备控制 |
支持 | 由浏览器和设备控制 |
| 点击指定位置对焦 | 不可控制 | 不支持 | 支持 | 不支持 |
focusAt() |
不支持 | 不支持 | 支持 | 不支持 |
autoZoom |
传给 uni.scanCode,是否生效由平台决定 |
支持 | 不生效 | 支持 |
双指缩放 / setZoom() |
不可控制 | 不支持 | 支持 | 支持 |
| 闪光灯 | 由系统界面控制 | 支持 | 支持 | 设备和浏览器支持时可用 |
| 完全自定义工具栏插槽 | 不支持 | nvue 当前页支持 | 原生全屏层不支持插槽,可配置按钮 | 支持 |
自动对焦与自动变焦是两个独立能力。系统扫码、标准相机和原生增强相机都会使用各自相机栈的自动对焦;autoZoom 只负责改变画面倍率。原生增强相机保留完整视野,不执行自动变焦,实时多码也不会为某一个码自动放大。用户可双指缩放、点击对焦,或调用 setZoom()、focusAt()。
非相机功能
| 功能 | App | H5 | 小程序 |
|---|---|---|---|
| 图片单码 / 多码 | 支持 | 取决于 BarcodeDetector 或 h5Decoder |
不支持组件直接识别本地图片 |
| 码制能力查询 | 支持,原生引擎返回明确列表 | 支持,按浏览器和解码器返回 | 系统页只能返回平台可声明的范围 |
| 结果内容解析与动作 | 支持 | 支持,受浏览器权限限制 | 支持,外部动作受平台安全策略限制 |
header / tip / result / toolbar 插槽 |
nvue 标准相机和 H5 支持;App Vue 独立页不能跨页传递 | 支持 | 系统扫码页不支持 |
图片识别通过 scanImage() 独立执行,不受 mode 影响。saveImage 依赖当前引擎能否返回识别画面路径;原生实时相机不保证能够保存预览帧,业务需要截图时应以返回的 path 是否为空为准。
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode |
String | auto |
auto 默认策略;api 系统扫码页;custom 自定义界面 |
scanType |
Array | ['qrCode','barCode'] |
请求识别的码制 |
onlyFromCamera |
Boolean | false |
系统扫码页仅允许相机扫码 |
autoZoom |
Boolean | true |
App 标准相机、H5 及支持该参数的系统扫码页自动变焦;原生增强和实时多码不生效 |
nativeCamera |
Boolean | false |
App 单码启用原生增强相机 |
autoCharset |
Boolean | false |
App barcode 自动识别字符集 |
enableAlbum |
Boolean | true |
显示或允许相册识别入口 |
color |
String | #15966A |
主题色 |
frameColor |
String | 空 | 单码扫描框颜色,空值使用主题色 |
scanbarColor |
String | 空 | 单码扫描线颜色,空值使用主题色 |
title |
String | 扫码 |
扫码页标题 |
tip |
String | 将二维码或条形码完整置于取景框内 |
扫码提示 |
showHeader |
Boolean | true |
是否显示顶部栏 |
showFlash |
Boolean | true |
是否显示闪光灯操作 |
showTrigger |
Boolean | true |
是否显示默认触发按钮 |
triggerText |
String | 开始扫描 |
默认触发按钮文字 |
showResult |
Boolean | true |
连续扫描时显示最新结果 |
showToolbar |
Boolean | true |
是否显示底部工具栏 |
toolbarItems |
Array | ['camera','flash','album'] |
工具栏项目和顺序 |
flashText |
String | 闪光灯 |
闪光灯关闭时文案 |
flashOffText |
String | 关闭 |
闪光灯开启时文案 |
albumText |
String | 相册 |
相册项文案 |
cameraText |
String | 切换镜头 |
切换镜头项文案 |
autoStart |
Boolean | false |
组件挂载后自动开始 |
continuous |
Boolean | false |
连续扫描 |
continuousInterval |
Number | 1000 |
连续扫描间隔,单位毫秒 |
multiple |
Boolean | false |
镜头或图片多码识别 |
dynamicMultiple |
Boolean | false |
多码标记是否随实时画面更新 |
maxResults |
Number | 0 |
多码最大返回数,0 不限制 |
dedupeTime |
Number | 0 |
相同内容去重时间,0 不去重 |
vibrate |
Boolean | true |
成功后震动 |
sound |
Boolean | true |
成功后播放提示音 |
soundSrc |
String | 空 | 自定义提示音路径 |
saveImage |
Boolean | false |
有可用图片路径时保存到相册 |
parse |
Boolean | true |
解析扫码内容并生成 parsed |
permissionTip |
Boolean | true |
权限拒绝后显示引导 |
safeAreaTop |
Boolean/String | auto |
顶部安全区策略 |
zIndex |
Number | 999 |
H5 扫码层级 |
pagePath |
String | /uni_modules/lf-scan/pages/scan/scan |
App Vue 扫码页路径 |
debug |
Boolean | false |
输出调试日志,生产环境建议关闭 |
h5Decoder |
Function | null |
H5 自定义解码器 |
h5Facing |
String | environment |
H5 默认摄像头方向 |
h5ScanInterval |
Number | 200 |
H5 解码间隔,单位毫秒 |
Events
| 事件 | 参数 | 说明 |
|---|---|---|
success |
result |
识别成功;多码图片返回含 results 的批次对象 |
fail |
{ errMsg, type, origin, supportedFormats?, unsupportedFormats? } |
扫描、权限或能力检查失败 |
cancel |
无 | 用户取消扫码 |
start |
无 | 扫描开始 |
stop |
无 | 扫描停止 |
flash-change |
Boolean |
闪光灯状态变化 |
select |
{ result, index } |
用户点击多码标记 |
toolbar-action |
{ key, text, item } |
工具栏项目被点击;item 返回完整按钮配置 |
Methods
| 方法 | 说明 |
|---|---|
start() / startScan() |
开始扫描 |
stop() / stopScan() |
停止自定义扫码;系统扫码页无法由组件强制关闭 |
cancel() |
停止并触发 cancel |
pause() / resume() |
暂停或恢复自定义相机 |
isScanning() |
返回当前扫描状态 |
setFlash(on) / toggleFlash() |
设置或切换闪光灯 |
setZoom(value) |
设置缩放倍数,返回实际倍数 Promise |
focusAt(x, y) |
按 0 到 1 的归一化坐标对焦 |
scanImage(path) / chooseImage() |
识别指定图片或打开相册选择器 |
getScanCapabilities() |
返回码制与功能能力 |
getResultActions(result) |
返回该结果可执行的动作列表 |
executeResultAction(action, result, options) |
执行结果动作 |
selectResult(result, index) |
选择多码结果 |
getLastResult() / getLastImage() |
获取最近结果或图片路径 |
getCameras() / getCameraCapabilities() |
获取 H5 摄像头列表或能力 |
switchCamera(deviceId) / toggleCamera() |
切换 H5 摄像头 |
captureImage(type, quality) |
获取 H5 当前预览截图 |
Slots
| 插槽 | 作用域参数 | 说明 |
|---|---|---|
trigger |
start、startScan、scanning |
自定义触发区;小程序不传函数,请通过 ref 调用 |
header |
cancel、title、scanning |
自定义顶部栏,App nvue/H5 |
tip |
awaitingSelection、results、tip |
自定义提示区,App nvue/H5 |
result |
count、latestText、lastResult |
自定义连续扫描结果区,App nvue/H5 |
toolbar |
items、action、flashOn、zoom |
自定义工具栏,App nvue/H5 |
数据类型
LfScanResult 识别结果
单个结果的主要字段:
| 字段 | 类型 | 说明 |
|---|---|---|
result |
String | 解码后的字符串内容 |
scanType |
String | 码制名称,如 QR_CODE、EAN_13、CODE_128 |
charSet |
String | 字符集,如 UTF-8、GBK |
rawData |
String | 原始数据(部分引擎会附加元数据) |
path |
String | 图片识别时的图片路径,实时扫描可能为空 |
source |
String | 结果来源:live(实时)或 image(图片) |
platform |
String | 识别平台,如 android、ios、h5、weixin |
timestamp |
Number | 识别时间戳(毫秒) |
bounds |
Object | 码在预览区域的归一化坐标 { x, y, width, height },取值 0~1 |
cornerPoints |
Array | 码的角点坐标数组 [{ x, y }, ...] |
imageSize |
Object | 识别图片尺寸 { width, height } |
parsed |
Object | 内容解析结果,见下方 LfScanParsed;parse=false 时为 null |
多码批次额外包含:
| 字段 | 类型 | 说明 |
|---|---|---|
results |
Array | 完整的子结果列表 |
detectedCount |
Number | 实际检测到的码数量 |
acceptedCount |
Number | 通过码制过滤后的数量 |
displayedCount |
Number | 受 maxResults 限制后展示的数量 |
LfScanParsed 内容解析
parse=true(默认)时,组件按内容自动识别类型,填充 result.parsed。字段随 parsed.type 变化:
type |
含义 | 主要字段 |
|---|---|---|
url |
网址 | url、scheme |
wifi |
WiFi 配置 | ssid、password、encryption、hidden |
vcard |
电子名片 | name、tel[]、email[]、org、title、url、address、note |
mecard |
名片(MeCard) | name、tel[]、email[]、url、address、note、org |
event |
日历事件 | summary、start、end、location、description |
tel |
电话号码 | number |
sms |
短信 | number、body |
email |
邮箱 | email、subject、body |
geo |
地理位置 | latitude、longitude、altitude |
product |
商品条码 | code、format |
json |
JSON 数据 | data |
text |
纯文本 | text |
所有解析结果均包含 type 与 raw(原始内容)两个公共字段。
LfScanFail 错误对象
| 字段 | 类型 | 说明 |
|---|---|---|
errMsg |
String | 错误描述 |
type |
String | 错误类型,见下方枚举 |
origin |
Any | 平台原始错误对象 |
supportedFormats |
String[] | 能力检查失败时,引擎支持的码制 |
unsupportedFormats |
String[] | 能力检查失败时,请求但不支持的码制 |
常见错误类型:permission(权限)、unsupported(能力不支持)、scan(扫描失败)、album(相册失败)、flash(闪光灯)、busy(占用)、action(动作失败)、cancel(取消)。
LfScanCapabilities 能力查询
getScanCapabilities() 返回对象包含 platform、engine、precise、known、requestedFormats、supportedFormats、unsupportedFormats、available 与 features(realtimeMultiple / zoom / focus / customToolbar / resultActions)。可在开始扫描前据此做能力适配。
码制
可用值:qrCode、barCode、barCodeAll、datamatrix、pdf417、aztec、maxicode、ean13、ean8、upca、upce、codabar、code39、code93、code128、itf、rss14、rssexpanded。
barCode 仅包含 EAN-13、UPC-A、Code 128,减少二维码纹理被短条码或无校验条码误识别的概率。需要其他一维码时显式指定具体码制或 barCodeAll。不同引擎的支持范围不完全一致,开始扫描前组件会检查能力;不支持时触发 fail,其中包含 supportedFormats 和 unsupportedFormats。
结果动作
const actions = this.$refs.scan.getResultActions(result);
this.$refs.scan.executeResultAction(actions[0], result, {
confirm: true,
confirmTitle: '确认操作'
});
动作名称:copy、share、open、call、wifi、navigate、email、sms。
| 动作 | 触发条件 | 是否二次确认 |
|---|---|---|
copy 复制 |
任意结果 | 否 |
share 分享 |
任意结果 | 否 |
open 打开网址 |
parsed.type === 'url' |
是 |
call 拨号 |
parsed.type === 'tel' |
是 |
wifi 连接 WiFi |
parsed.type === 'wifi' |
是 |
navigate 导航 |
parsed.type === 'geo' |
是 |
email 发邮件 |
parsed.type === 'email' |
是 |
sms 发短信 |
parsed.type === 'sms' |
是 |
涉及打开外部应用、拨号、连接 WiFi 和导航的动作默认二次确认,可传 confirm: false 关闭。小程序受平台安全策略限制,外部 URL 和系统分享等动作可能返回 unsupported。
场景示例
单码扫描
<lf-scan ref="scan" :show-trigger="false" @success="onSuccess" />
连续逐个扫描
<lf-scan
ref="scan"
:show-trigger="false"
:continuous="true"
:continuous-interval="800"
:dedupe-time="1500"
@success="onEachResult"
/>
每次识别都会触发 success。continuousInterval 控制两次解码之间的等待时间;dedupeTime=0 表示不去重。
实时多码(定格 / 动态)
<lf-scan
ref="scan"
:show-trigger="false"
:multiple="true"
:dynamic-multiple="false"
@select=""
@success="onSuccess"
/>
dynamicMultiple=false 时,检测到多个码后定格当前画面,用户点击对应标记返回结果。dynamicMultiple=true 时保持实时预览,码移出画面后标记自动消失。多码结果默认不限制数量;设置 maxResults 可限制返回数量。
原生实时多码会把分析帧中的位置转换到当前预览层,设备倾斜或旋转后仍按屏幕上的实际位置显示标记。bounds 使用当前预览区域的 0 到 1 归一化坐标;不要直接把原始相机像素坐标当作页面坐标使用。
图片多码
this.$refs.scan.scanImage(localPath);
// 或打开相册选择
this.$refs.scan.chooseImage();
组件设置 multiple=true 时,success 返回批次对象,完整列表位于 results。App 和 H5 支持该能力,小程序不支持组件直接识别本地图片。
原生相机增强
<lf-scan ref="scan" :native-camera="true" />
App 单码默认使用 DCloud barcode 控件;开启 nativeCamera 后改用原生 CameraX/AVFoundation 引擎,支持连续自动对焦、双指缩放、setZoom() 和 focusAt()。实时多码始终使用原生引擎。原生增强模式不执行 autoZoom;系统扫码页的相机控制由系统决定。
自定义工具栏
<lf-scan
:toolbar-items="[
{ key: 'flash', text: '照明' },
{ key: 'album', text: '图片' },
{ key: 'zoom-in', text: '放大', icon: '+' },
{ key: 'help', text: '帮助', icon: '?' }
]"
@toolbar-action="onToolbarAction"
/>
内置动作包括 flash、album、camera、close、pause、resume、zoom-in 和 zoom-out。未知 key 不执行内置操作,只触发 toolbar-action,由业务自行处理。工具栏项目支持 text、icon、textColor、backgroundColor、size 和 show。
所有自定义扫码界面都支持通过 toolbarItems 配置按钮顺序、文案、图标、颜色、尺寸和显示状态,并通过 toolbar-action 接收点击事件。App Vue 使用独立扫码页,插槽无法跨页面传递,但 toolbarItems 和 toolbar-action 会传递到该扫码页;App nvue 与 H5 还可通过 header、tip、result、toolbar 插槽完全替换对应区域。系统扫码页不支持自定义操作栏。
H5 自定义解码器
不支持 BarcodeDetector 的浏览器可传入业务解码器:
<lf-scan :h5-decoder="decode" />
函数签名:
decode(imageData, { width, height, canvas })
可同步或异步返回字符串、单个 { result, scanType, bounds }、结果数组或 { results }。多码位置 bounds 使用 0 到 1 的归一化坐标。
相机控制
const scan = this.$refs.scan;
scan.toggleFlash(); // 切换闪光灯
scan.setFlash(true); // 打开闪光灯
scan.setZoom(2.5).then(v => {}) // 设置缩放倍数,返回实际值
scan.focusAt(0.5, 0.5); // 点按画面中心对焦
scan.toggleCamera(); // H5 切换前后镜头
scan.captureImage('png', 0.9); // H5 获取当前预览截图
工具函数
import {
parseScanResult,
createScanHistory,
checkCameraPermission,
getScanResultActions,
executeScanResultAction,
getStaticFormatCapability
} from '@/uni_modules/lf-scan/index.js';
常见问题
扫码黑屏 / 无画面? 确认已勾选 Camera 模块、权限已授权,且 App 端已重新制作包含插件 UTS 原生依赖的自定义基座。
App 点扫码没反应? 检查 pages.json 是否已注册 uni_modules/lf-scan/pages/scan/scan;未注册时 App Vue 页面会静默回退到系统扫码页。
H5 无法调用摄像头? 浏览器要求 HTTPS 或 localhost;Safari 无原生 BarcodeDetector,需传入 h5Decoder。最终能力以 getScanCapabilities() 返回为准。
多码标记位置不准? 标记基于预览区域的归一化坐标;请勿把原始相机像素坐标当页面坐标。若做了自定义缩放或裁剪,请核对坐标映射。
请求的码制不生效? 组件会在启动前校验码制能力,不支持的码制通过 fail 返回 supportedFormats / unsupportedFormats,请据此调整 scanType。
实时多码画面卡顿? 实时多码固定走原生引擎,请确认已使用自定义基座;H5 端性能取决于浏览器 BarcodeDetector 与设备算力。
隐私说明
插件仅在设备本地处理相机画面、用户主动选择的图片和扫码结果,不采集、不存储、不上传用户数据。相机用于实时扫码;相册用于图片识别或保存截图;震动用于成功反馈;WiFi、网络状态和定位权限只在业务主动执行 WiFi 连接动作时使用。宿主应用仍需根据实际业务完善隐私政策和系统权限用途说明。
注意事项
- 原生依赖或权限变化后必须重新制作自定义基座,旧基座不会自动包含新能力。
- 动态多码适合持续跟踪;定格多码的位置最稳定,默认建议使用定格模式。
- H5 相机必须运行在 HTTPS 或 localhost;浏览器最终支持能力以
getScanCapabilities()返回为准。 - iOS、H5 和各小程序应在发布前使用目标设备复核权限文案、相机能力及平台审核要求。
debug只用于排查原始识别事件,正式发布时应保持关闭。
许可证
MIT License,详见 license.md。

收藏人数:
下载插件并导入HBuilderX
下载示例项目ZIP
赞赏(3)
下载 858
赞赏 10
下载 12753694
赞赏 1959
赞赏
京公网安备:11010802035340号