更新记录

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。

依赖原生三方库,必须使用自定义调试基座或正式云打包后才能真机调用。


目录

  1. 功能一览
  2. 安装
  3. 制作自定义基座(必做)
  4. 快速上手
  5. 进阶用法
  6. API
  7. 错误码
  8. 扫码页交互说明
  9. 码制 formats 取值
  10. 常见问题
  11. 注意事项
  12. 目录结构
  13. 版本

功能一览

能力 说明
全格式识别 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.1
  • com.google.mlkit:barcode-scanning 17.3.0

标准基座不含上述库,不制作自定义基座会调用失败 / 编译不过

步骤

  1. HBuilderX 菜单:运行运行到手机或模拟器制作自定义调试基座
  2. 选择当前项目,填写 Android 包名、证书(可用公共测试证书)
  3. 云打包,等待完成并安装到手机
  4. 之后每次运行选择 「自定义调试基座」,再打开演示页或业务页调试扫码

正式发版:使用 云打包 / 本地打包 生成安装包即可(打包流程会带上 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_CODECODE_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 未获取到有效扫码结果 成功关页但内容为空(少见)

说明:

  • failcomplete 在失败时都会触发(连续扫「已有命中后关闭」除外:只 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' 后调用。


注意事项

  1. 仅 Android;发布市场包请走正式打包,勿依赖标准基座调试结果。
  2. 需相机权限;震动权限已在插件 Manifest 声明(vibrate: false 可不震动)。
  3. 相册选图走系统选择器,一般无需额外存储权限(视系统版本而定)。
  4. 连续扫依赖原生命中队列 + 桥接轮询,关闭页后务必以 complete 收尾业务状态。
  5. 多码点选依赖定位框;少数码无包围盒时走单码自动完成逻辑。
  6. 文档与演示不保证覆盖所有机型相机差异,建议主流机型回归。

目录结构

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

相关链接

隐私、权限声明

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

相机、震动

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

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

许可协议

MIT协议

暂无用户评论。