更新记录
1.1.0(2026-07-22) 下载此版本
增强:权限错误码区分、关闭/相册识图、码制过滤、成功震动、连续扫码;Kotlin 模块拆分
平台兼容性
uni-app(5.0)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | × | √ | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.0)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| × | × | √ |
kex-code-scan
Android 端扫码 UTS API 插件(非 Vue 组件)。
基于 CameraX + Google ML Kit,支持全格式条码/二维码、多码同屏点选、智能变焦、相册识图、连续扫码。
支持:Android App(uni-app Vue2/Vue3)。
暂不支持:iOS / 鸿蒙 / H5 / 小程序 / nvue。
依赖原生三方库,必须使用自定义调试基座或正式云打包后才能真机调用。
目录
功能一览
| 能力 | 说明 |
|---|---|
| 全格式识别 | QR / EAN / CODE_128 / PDF417 / AZTEC 等 |
| 码制过滤 | formats 只扫指定类型 |
| 单码自动返回 | 识别成功后关闭并回调 |
| 多码点选 | 同屏多个码定格,点选其中一个 |
| 智能变焦 | smartZoom:码偏小时自动放大 |
| 手势缩放 | 双指捏合 |
| 手电筒 | 扫码页右下角开关 |
| 相册识图 | 页内相册按钮,或 fromAlbum: true |
| 连续扫码 | continuous: true,多次 success,点关闭结束 |
| 成功震动 | vibrate,可关 |
| 错误码区分 | 权限拒绝 9021002 ≠ 用户取消 9021003 |
安装
将插件拷贝到业务项目:
你的项目/uni_modules/kex-code-scan/
UTS 插件需 import 后调用,不会 easycom 自动注册组件。
要求:
- HBuilderX ≥ 3.6.8(建议较新版本)
- uni-app Vue2 / Vue3 均可
- 仅 Android;需制作自定义基座
本仓库演示页:首页 → kex-code-scan,或路径 /pages/demos/code-scan/index。
制作自定义基座(必做)
插件依赖:
androidx.camera:*1.4.1com.google.mlkit:barcode-scanning17.3.0
标准基座不含上述库,不制作自定义基座会调用失败 / 编译不过。
步骤
- HBuilderX 菜单:运行 → 运行到手机或模拟器 → 制作自定义调试基座
- 选择当前项目,填写 Android 包名、证书(可用公共测试证书)
- 云打包,等待完成并安装到手机
- 之后每次运行选择 「自定义调试基座」,再打开演示页或业务页调试扫码
正式发版:使用 云打包 / 本地打包 生成安装包即可(打包流程会带上 UTS 原生依赖)。
快速上手
1. uni-app(Vue3 <script setup>)
<template>
<view>
<button type="primary" @click="doScan">扫码</button>
<text>{{ tip }}</text>
</view>
</template>
<script setup>
import { ref } from 'vue'
import { openCodeScan } from '@/uni_modules/kex-code-scan'
const tip = ref('')
const doScan = () => {
openCodeScan({
success: (res) => {
tip.value = res.content + ' / ' + res.format
},
fail: (err) => {
tip.value = err.errMsg + '(' + err.errCode + ')'
}
})
}
</script>
2. uni-app(Options API)
import { openCodeScan } from '@/uni_modules/kex-code-scan'
export default {
methods: {
doScan() {
openCodeScan({
success: (res) => {
console.log(res.content, res.format, res.fromAlbum)
},
fail: (err) => {
console.log(err.errCode, err.errMsg)
},
complete: () => {
console.log('扫码流程结束')
}
})
}
}
}
3. 最少参数
import { openCodeScan } from '@/uni_modules/kex-code-scan'
openCodeScan({
success: (res) => console.log(res.content)
})
进阶用法
只扫二维码
openCodeScan({
formats: ['QR_CODE'],
success: (res) => console.log(res.content)
})
关闭智能变焦 / 震动
openCodeScan({
smartZoom: false,
vibrate: false,
success: (res) => console.log(res.content)
})
打开后直接进相册
openCodeScan({
fromAlbum: true,
success: (res) => {
console.log(res.content, res.fromAlbum) // fromAlbum === true
}
})
扫码页内也可随时点左下角 相册 按钮选图识别。
连续扫码
页内不关闭,每识别一次触发一次 success;用户点左上角关闭(或系统返回)后走 complete(若已有命中,不会再走 fail)。
const list = []
openCodeScan({
continuous: true,
vibrate: true,
success: (res) => {
list.push(res.content)
console.log('命中', res.content, res.format)
},
fail: (err) => {
// 一次都没扫到就关闭 → 一般是 9021003 取消
console.log('失败', err.errCode, err.errMsg)
},
complete: (res) => {
if (res && res.closed) {
console.log('结束,共', res.hitCount, '次', list)
}
}
})
组合:仅二维码 + 连续扫 + 相册入口
openCodeScan({
formats: ['QR_CODE'],
continuous: true,
smartZoom: true,
vibrate: true,
success: (res) => console.log(res),
complete: (res) => console.log('done', res)
})
API
openCodeScan(options?)
打开全屏扫码页。
CodeScanOptions
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
smartZoom |
boolean |
否 | true |
条码占画面较小时自动放大 |
formats |
string[] |
否 | 全部 | 限定码制,见下方取值表;空/不传 = 全格式 |
vibrate |
boolean |
否 | true |
识别成功是否短震动 |
continuous |
boolean |
否 | false |
连续扫:多次 success,点关闭结束 |
fromAlbum |
boolean |
否 | false |
true 时打开后先拉起系统相册 |
success |
(res) => void |
否 | - | 成功(连续模式下可多次) |
fail |
(err) => void |
否 | - | 失败 |
complete |
(res) => void |
否 | - | 结束(成功失败都会调;连续扫关闭时也可能只调 complete) |
CodeScanSuccess
| 字段 | 类型 | 说明 |
|---|---|---|
content |
string |
识别到的文本内容 |
format |
string |
码制名,如 QR_CODE、CODE_128 |
fromAlbum |
boolean |
是否来自相册识图(可选) |
CodeScanFail
继承 UniError:
| 字段 | 类型 | 说明 |
|---|---|---|
errCode |
number |
见错误码表 |
errMsg |
string |
错误描述 |
errSubject |
string |
固定 "kex-code-scan" |
类型定义(摘录)
type CodeScanOptions = {
smartZoom?: boolean
formats?: string[]
vibrate?: boolean
continuous?: boolean
fromAlbum?: boolean
success?: (res: CodeScanSuccess) => void
fail?: (res: CodeScanFail) => void
complete?: (res: any) => void
}
type CodeScanSuccess = {
content: string
format: string
fromAlbum?: boolean
}
错误码
| 错误码 | 说明 | 常见场景 |
|---|---|---|
9021001 |
无法获取页面 Activity / 平台不支持 | 非 Android、页面上下文异常 |
9021002 |
相机权限被拒绝 | 用户拒绝相机权限(非「仅相册」场景) |
9021003 |
用户取消扫码 | 点关闭、系统返回、未扫就退出 |
9021004 |
未获取到有效扫码结果 | 成功关页但内容为空(少见) |
说明:
fail与complete在失败时都会触发(连续扫「已有命中后关闭」除外:只complete)。- 打开即相册且无相机权限时,仍可用相册;点关闭且无命中 → 一般为
9021003。
扫码页交互说明
| 控件 / 手势 | 说明 |
|---|---|
| 左上关闭 | 退出;连续扫时结束会话 |
| 左下相册 | 选图识别;多码时同样可点选 |
| 右下手电筒 | 有闪光灯时可用 |
| 双指捏合 | 手动变焦 |
| 多码绿点 | 同屏多个有效码时定格,点击选中 |
| 系统返回键 | 等同关闭 |
码制 formats 取值
传入字符串数组,非法值忽略;若解析后为空则按全格式。
| 取值 | 说明 |
|---|---|
QR_CODE / QR |
二维码 |
EAN_13 / EAN_8 |
商品条码 |
CODE_128 / CODE_39 / CODE_93 |
一维码 |
CODABAR |
Codabar |
DATA_MATRIX |
Data Matrix |
UPC_A / UPC_E |
UPC |
ITF |
ITF |
PDF417 |
PDF417 |
AZTEC |
Aztec |
ALL |
全格式(与具体码制勿混用,混用时按全格式) |
示例:
formats: ['QR_CODE', 'CODE_128', 'EAN_13']
常见问题
1. 点击没反应 / 报找不到类?
未使用自定义基座。请按上文制作并选择「自定义调试基座」再运行。
2. 提示相机权限被拒绝(9021002)?
到系统设置打开应用相机权限后重试。
3. 连续扫只回调一次?
确认传了 continuous: true。同一内容约 1.2 秒内会去重,避免狂刷;换个码或稍等再扫。
4. 相册选了图但提示未识别?
图中可能没有清晰条码,或被 formats 过滤掉。可先不传 formats 试全格式。
5. iOS / 鸿蒙能用吗?
当前版本仅 Android。目录未包含 iOS/鸿蒙实现。
6. 能否当组件标签用?
不能。这是 UTS API,请 import { openCodeScan } from '@/uni_modules/kex-code-scan' 后调用。
注意事项
- 仅 Android;发布市场包请走正式打包,勿依赖标准基座调试结果。
- 需相机权限;震动权限已在插件 Manifest 声明(
vibrate: false可不震动)。 - 相册选图走系统选择器,一般无需额外存储权限(视系统版本而定)。
- 连续扫依赖原生命中队列 + 桥接轮询,关闭页后务必以
complete收尾业务状态。 - 多码点选依赖定位框;少数码无包围盒时走单码自动完成逻辑。
- 文档与演示不保证覆盖所有机型相机差异,建议主流机型回归。
目录结构
kex-code-scan/
├── package.json
├── readme.md
├── changelog.md
├── FEATURES.md
└── utssdk/
├── interface.uts # 对外类型与 API 声明
├── unierror.uts # 错误实现
└── app-android/
├── index.uts # JS/UTS 桥接
├── config.json # 原生依赖
├── AndroidManifest.xml
├── CodeCaptureActivity.kt
├── MultiCodePickView.kt
├── ScanFrameDecorView.kt
├── YuvFrames.kt
├── SymbologyUtil.kt
├── CodeScanHitBus.kt
└── res/drawable/ # 关闭/相册等资源
版本
| 版本 | 说明 |
|---|---|
| 1.1.0 | 权限码区分、关闭/相册、码制过滤、震动、连续扫、Kotlin 拆分 |
| 1.0.0 | Android 扫码初版 |
更多变更见 changelog.md。能力清单见 FEATURES.md。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 8
赞赏 0
下载 12450824
赞赏 1935
赞赏
京公网安备:11010802035340号