更新记录

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 语义变更为「组件挂载后自动开始扫码」,默认 false
  • autoCharset 默认 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-x

uni-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。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

相机权限用于实时扫码;相册权限用于选择图片识别或保存截图;震动权限用于识别成功反馈;WiFi、网络状态和定位权限仅在业务主动调用 WiFi 连接动作时使用。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件仅在设备本地处理相机画面、用户选择的图片和扫码结果,不采集、不存储、不上传任何用户数据。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT License

Copyright (c) 2026 lf-scan contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.