更新记录

1.0.0(2026-06-05)

  • 首次发布全端扫码插件。
  • 支持 Android、iOS、HarmonyOS、H5 和主流小程序扫码。
  • 支持相册识别、能力检测、Promise 调用和全端二维码生成。
  • 示例工程已完成 Android/iOS 真机验证,并优化二维码生成结果展示。

平台兼容性

uni-app(4.71)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × ×

uni-app x(4.71)

Chrome Safari Android iOS 鸿蒙 微信小程序

JQ-UniScan-UTS 全端原生扫码插件

JQ-UniScan-UTS 是一个面向 uni-app / uni-app x 的全端扫码插件,统一封装 Android、iOS、HarmonyOS、H5 与主流小程序扫码能力。

App、HarmonyOS、小程序端优先调用平台原生扫码能力,直接使用系统/平台扫码相机,识别速度快、聚焦稳定、码制识别准确;H5 端补齐 uni.scanCode 不支持浏览器扫码的问题,优先使用浏览器原生 BarcodeDetector,不支持时自动回退到 ZXing 解码。

插件同时提供全端二维码生成能力,Android、iOS、HarmonyOS、H5、小程序都可以生成 PNG dataURL,直接显示在 <image> 中。1.0.1 起失败回调会额外返回 suggestion,便于快速定位权限、H5 HTTPS、用户取消、图片不清晰等常见问题。

适合场景

  • 商品条码、物流单号、票券二维码、门店核销码识别
  • App、H5、小程序统一扫码入口
  • 需要相册识别二维码/条形码的业务
  • 后台、收银、仓储、巡检、会员核销、票务等高频扫码业务
  • 需要在前端生成二维码并展示/保存/分享的业务

核心优势

  • 原生相机扫码:Android/iOS/HarmonyOS/小程序优先复用平台扫码页面,识别快、稳定、准确。
  • H5 可扫码:H5 内置摄像头扫码和相册图片识别,兼容移动浏览器。
  • 自动双引擎:H5 优先 BarcodeDetector,不支持时使用 ZXing 回退。
  • 统一返回值:不同平台扫码结果字段统一为 resultscanTypeerrMsg
  • 全端二维码生成:不依赖 DOM、不依赖 canvas,返回 PNG dataURL
  • Promise 和 callback 都支持:旧项目、新项目都能快速接入。
  • 不上传数据:扫码、图片识别、二维码生成均在本地完成。

平台支持

平台 扫码 相册识别 生成二维码 说明
Android App 支持 支持平台扫码页相册入口 支持 使用平台原生扫码能力
iOS App 支持 支持平台扫码页相册入口 支持 使用平台原生扫码能力
HarmonyOS 支持 支持平台能力 支持 按平台扫码能力归一化
H5 支持 支持 支持 BarcodeDetector + ZXing
微信小程序 支持 支持平台扫码页相册入口 支持 复用小程序扫码 API
支付宝/百度/字节/QQ/钉钉/快手/飞书/京东小程序 支持 支持平台能力 支持 按平台能力归一化

安装方法

方法一:插件市场导入

  1. 在 DCloud 插件市场打开本插件页面。
  2. 点击“使用 HBuilderX 导入插件”。
  3. 选择你的 uni-app 项目。
  4. 导入后确认项目中存在:
uni_modules/JQ-UniScan-UTS

方法二:手动导入

  1. 下载插件压缩包。
  2. 解压后将 JQ-UniScan-UTS 目录复制到项目:
你的项目/uni_modules/JQ-UniScan-UTS
  1. 重新运行或重新编译项目。

H5 依赖安装

如果需要在 H5 端使用摄像头扫码和图片识别,请在 HBuilderX 中执行:

工具 -> 插件安装三方依赖

或进入插件 H5 依赖目录安装:

cd uni_modules/JQ-UniScan-UTS/utssdk/web
npm install

H5 摄像头需要 HTTPS 或 localhost 环境,否则浏览器通常会禁止访问摄像头。

三分钟接入

在页面中引入插件:

import {
  createQRCode,
  decodeImage,
  getScanCapability,
  scanCode,
  scanCodeAsync
} from '@/uni_modules/JQ-UniScan-UTS/index.js'

1. 调起扫码

scanCode({
  scanType: ['all'],
  onlyFromCamera: false,
  success(res) {
    console.log('扫码结果:', res.result)
    console.log('码类型:', res.scanType)
  },
  fail(err) {
    console.log('扫码失败:', err.errMsg)
  }
})

2. 只允许相机扫码

scanCode({
  scanType: ['qrCode', 'barCode'],
  onlyFromCamera: true,
  success(res) {
    console.log(res.result)
  }
})

3. Promise 写法

async function scan() {
  try {
    const res = await scanCodeAsync({
      scanType: ['qrCode', 'barCode'],
      timeout: 30000
    })
    console.log(res.result)
  } catch (err) {
    console.log(err.errMsg)
  }
}

4. 相册识别

decodeImage({
  success(res) {
    console.log('图片识别结果:', res.result)
  },
  fail(err) {
    console.log(err.errMsg)
  }
})

说明:H5 端支持选择图片识别;App/小程序端建议使用 scanCode({ onlyFromCamera: false }) 调起平台扫码页,由平台扫码页提供相册入口。

5. 生成二维码

<template>
  <view>
    <image :src="qrCode" mode="aspectFit" style="width: 220px; height: 220px;" />
    <button @click="makeQRCode">生成二维码</button>
  </view>
</template>

<script setup>
import { ref } from 'vue'
import { createQRCode } from '@/uni_modules/JQ-UniScan-UTS/index.js'

const qrCode = ref('')

function makeQRCode() {
  createQRCode({
    content: 'https://ext.dcloud.net.cn/',
    width: 280,
    margin: 2,
    darkColor: '#000000',
    lightColor: '#ffffff',
    errorCorrectionLevel: 'M',
    success(res) {
      qrCode.value = res.dataURL
    },
    fail(err) {
      console.log(err.errMsg)
    }
  })
}
</script>

createQRCode 返回 PNG dataURL,可直接赋值给 <image>。Android、iOS、HarmonyOS、H5、小程序均可使用。

6. 获取当前平台能力

const capability = getScanCapability()
console.log(capability)

返回示例:

{
  platform: 'uni-app',
  nativeScan: true,
  h5Camera: false,
  h5BarcodeDetector: false,
  h5ZXing: false,
  supportAlbum: true,
  supportFormats: ['barCode', 'qrCode', 'datamatrix', 'pdf417'],
  errMsg: 'getScanCapability:ok'
}

API 说明

scanCode(options)

兼容 uni.scanCode 的 callback 风格。

参数 类型 默认值 说明
scanType string[] ['barCode','qrCode','datamatrix','pdf417'] 扫码类型
onlyFromCamera boolean false 是否只允许相机扫码
autoDecodeCharset boolean true App 端透传给平台扫码 API
autoZoom boolean true App 端透传给平台扫码 API
timeout number 0 H5 端扫码超时,单位毫秒,0 表示不限制
title string '' H5 扫码弹层标题
success Function - 成功回调
fail Function - 失败回调
complete Function - 完成回调

支持的 scanType

[
  'all',
  'qrCode',
  'barCode',
  'datamatrix',
  'dataMatrix',
  'pdf417',
  'codabar',
  'code39',
  'code93',
  'code128',
  'ean8',
  'ean13',
  'itf',
  'upcA',
  'upcE',
  'aztec'
]

成功返回:

{
  result: string
  scanType: string
  charSet?: string
  path?: string
  rawData?: string
  errMsg: 'scanCode:ok'
}

失败返回:

{
  errMsg: string
  errCode?: number
  message?: string
  suggestion?: string
}

suggestion 是面向接入排查的中文建议,常见场景包括用户取消、摄像头权限未开、H5 非 HTTPS、扫码超时、相册图片不清晰等。

scanCodeAsync(options)

Promise 版本扫码 API。

const res = await scanCodeAsync({ scanType: ['all'] })

decodeImage(options)

识别图片中的二维码或条形码。

参数 类型 说明
filePath string H5 可传入图片路径;不传时弹出图片选择
success Function 成功回调
fail Function 失败回调
complete Function 完成回调

getScanCapability()

返回当前平台的扫码能力。

createQRCode(options)

生成二维码 PNG dataURL

参数 类型 默认值 说明
content string 必填 二维码内容
width number 256 输出图片宽度
height number width 兼容字段,目前输出为正方形
margin number 4 二维码留白
darkColor string #000000 深色模块颜色,支持 hex/rgb/rgba
lightColor string #ffffff 背景颜色,支持 hex/rgb/rgba/transparent
errorCorrectionLevel string M 纠错等级:LMQH
success Function - 成功回调
fail Function - 失败回调
complete Function - 完成回调

成功返回:

{
  dataURL: string
  tempFilePath: string
  errMsg: 'createQRCode:ok'
}

tempFilePath 当前默认为空,推荐直接使用 dataURL 显示。

完整页面示例

<template>
  <view class="page">
    <button @click="onScan">扫码</button>
    <button @click="onCreateQRCode">生成二维码</button>
    <image v-if="qrCode" :src="qrCode" mode="aspectFit" style="width: 220px; height: 220px;" />
    <text>{{ logText }}</text>
  </view>
</template>

<script setup>
import { ref } from 'vue'
import { createQRCode, scanCode } from '@/uni_modules/JQ-UniScan-UTS/index.js'

const logText = ref('等待操作')
const qrCode = ref('')

function onScan() {
  scanCode({
    scanType: ['all'],
    success(res) {
      logText.value = res.result
    },
    fail(err) {
      logText.value = err.errMsg
    }
  })
}

function onCreateQRCode() {
  createQRCode({
    content: 'https://ext.dcloud.net.cn/',
    width: 280,
    success(res) {
      qrCode.value = res.dataURL
      logText.value = res.errMsg
    },
    fail(err) {
      logText.value = err.errMsg
    }
  })
}
</script>

真机验证

当前功能链路已完成以下验证;1.0.1 为错误提示和资料迭代,市场上传前仍需按发布清单复跑 Android/iOS 真机:

  • Android 真机:扫码成功,二维码生成成功。
  • iPhone 真机:扫码成功,项目运行和资源同步成功。
  • 微信小程序:编译通过。
  • 本地校验:二维码 PNG dataURL 生成后可被 ZXing 反向解码。

权限说明

  • Android/iOS/HarmonyOS/小程序:由平台扫码 API 申请摄像头权限。
  • H5:浏览器会请求摄像头权限,需要 HTTPS 或 localhost。
  • 相册识别:平台可能请求相册读取权限。

隐私说明

插件不采集、不存储、不上传扫码内容、图片内容或二维码内容。

  • App/小程序扫码由平台本地扫码能力处理。
  • H5 摄像头扫码在浏览器本地完成。
  • H5 图片识别在浏览器本地完成。
  • 二维码生成在本地内存中完成。

常见问题

H5 端打不开摄像头?

请确认页面运行在 HTTPS 或 localhost 环境,并且用户已允许浏览器摄像头权限。

返回 scanCode:fail cancel 是 bug 吗?

不是。用户点击返回、关闭扫码页或取消相册选择时,平台通常会返回 cancel。业务侧可以忽略该结果,或提示用户重新扫码。

App 端相册识别为什么不是直接调用 decodeImage

App、HarmonyOS、小程序端建议使用 scanCode({ onlyFromCamera: false }),由平台扫码页提供相册入口。H5 端才提供独立 decodeImage 图片识别。

H5 扫码超时怎么办?

先确认二维码完整入镜、光线充足、浏览器已授权摄像头。业务上可以调大 timeout,或让用户改用相册识别。

App 端为什么识别这么快?

App 端优先复用平台原生扫码相机,底层聚焦、曝光、识别链路由系统/平台能力完成,速度和准确率都优于普通 WebView 内自绘扫码。

小程序端是否需要单独配置?

通常不需要。小程序端调用平台扫码 API,具体码制和相册入口以对应小程序平台能力为准。

生成二维码是否依赖 canvas?

不依赖。插件内置纯 JS PNG 生成器,直接返回 dataURL,App/H5/小程序都可显示。

可以识别哪些码?

常用二维码、条形码、DataMatrix、PDF417 均已归一化支持;具体最终识别范围以平台扫码能力为准。

更新记录

详见 changelog.md

隐私、权限声明

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

Android/iOS/HarmonyOS/小程序端由平台扫码 API 申请摄像头权限;H5 端调用浏览器 getUserMedia,需要 HTTPS 或 localhost 环境。允许从相册识别时,平台可能请求相册读取权限。

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

插件不采集、不存储、不上传扫码数据。扫码结果仅通过调用方传入的 success/complete 回调或 Promise 返回给业务代码。H5 端使用浏览器本地摄像头、图片解码能力或本地 ZXing 解码库,不会向第三方服务器发送图片或扫码内容。

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

无广告展示能力。

暂无用户评论。