更新记录

1.2.0(2026-07-14)

  • 新增 successTipText 配置项,用于自定义连续扫码成功提示文案
  • 新增 pinchZoom 配置项,用于控制扫码页面是否支持双指缩放
  • 修复连续扫码模式下,从相册识别成功后扫码页面会直接退出的问题

1.1.0(2026-07-13)

  • 新增 deduplicate 配置项,用于控制连续扫码结果是否去重,默认 false
  • 新增 scanInterval 配置项,用于限制连续扫码回调的最小间隔(ms)
  • 新增 showSuccessTip 配置项,用于控制连续扫码成功提示是否显示
  • 新增 closeScan() 方法,可主动关闭扫码页面
  • 修复了一些问题

1.0.2(2026-07-11)

  • 修复连续扫码多次触发回调时,可能出现 success/complete 回调函数已释放,不能再次执行 的问题
查看更多

平台兼容性

uni-app(3.8.0)

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

uni-app x(3.8.0)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

s-scan 原生扫码插件

s-scan 是一个 UTS 原生扫码插件,支持 App Android 和 App iOS。插件提供接近微信扫码的全屏体验,包含实时扫码、相册识别、手电筒、多码点选、连续扫码、震动和提示音等能力,可用于设备绑定、商品条码识别、票券核销、二维码登录等场景。

重点提示:本插件是 UTS 原生插件,本地运行和真机调试前需要先制作并使用自定义调试基座。直接使用标准基座运行时,原生扫码能力不会被打包进 App,可能出现插件不存在、调用失败或无响应等情况。

功能特性

  • 支持二维码、常见条形码、DataMatrix、PDF417。
  • 支持 scanCode(options) 回调写法和 scanCodeAsync(options) Promise 写法。
  • 支持自定义标题、提示文案、提示背景色、扫描线颜色和手电筒激活色。
  • 支持相机扫码和相册图片识别。
  • 支持同时识别多个码时手动点选目标码。
  • 支持连续扫码,适合批量盘点、批量核销等场景。
  • 支持业务代码主动关闭当前扫码页。
  • 支持扫码成功后的震动和 Beep 提示音。
  • 支持 onlyFromCamerasuccessfailcompleteuni.scanCode 常用字段。

安装说明

  1. 在插件市场导入本插件到项目。
  2. 确认项目已包含 uni_modules/s-scan 目录。
  3. 在需要扫码的页面中按下面示例导入并调用。
import { scanCode, scanCodeAsync, closeScan } from '@/uni_modules/s-scan'

基础用法

回调写法

import { scanCode } from '@/uni_modules/s-scan'

scanCode({
  title: '扫码',
  content: '将二维码或条形码放入屏幕内',
  scanType: ['qrCode', 'barCode'],
  success(res) {
    console.log('扫码结果', res.result)
  },
  fail(err) {
    console.log('扫码失败', err.errCode, err.errMsg)
  },
  complete(res) {
    console.log('扫码完成', res)
  },
})

Promise 写法

import { scanCodeAsync } from '@/uni_modules/s-scan'

try {
  const res = await scanCodeAsync({
    title: '扫码',
    content: '将二维码或条形码放入屏幕内',
  })
  console.log('扫码结果', res.result)
} catch (err) {
  console.log('扫码失败', err.errCode, err.errMsg)
}

完整配置

scanCode({
  title: '设备扫码',
  titleStyle: {
    color: '#FFFFFF',
    fontSize: 18,
  },
  content: '请扫描设备机身二维码',
  contentStyle: {
    color: '#FFFFFF',
    fontSize: 15,
    backgroundColor: '#66000000',
  },
  scanType: ['qrCode', 'barCode'],
  vibrate: false,
  beep: false,
  manualSelect: true,
  scanLineColor: '#07C160',
  flashlightActiveColor: '#07C160',
  autoZoom: true,
  pinchZoom: true,
  showFlashlight: true,
  showAlbum: true,
  continuous: false,
  deduplicate: false,
  showSuccessTip: true,
  successTipText: '扫描成功',
  scanInterval: 1200,
  onlyFromCamera: false,
  success(res) {},
  fail(err) {},
  complete(res) {},
})

连续扫码

开启 continuous 后,扫码页不会在识别成功后自动关闭。每次识别到结果都会触发 success;用户关闭扫码页时,会再返回一次当前已识别结果列表。

scanCode({
  continuous: true,
  success(res) {
    if (Array.isArray(res.result)) {
      console.log('本次连续扫码汇总', res.result)
      return
    }
    console.log('单次扫码结果', res.result)
  },
})

使用 scanCodeAsync 开启连续扫码时,Promise 会在用户关闭扫码页并返回汇总结果后 resolve。

如需在连续扫码中让相同内容只回调并汇总一次,可设置 deduplicate: true。默认 false,相同码再次识别时仍会触发回调,并保留在关闭页面时返回的汇总列表中。

连续扫码成功后默认会显示轻量的“扫描成功”提示,可通过 showSuccessTip: false 关闭,也可以通过 successTipText 自定义提示文案;scanInterval 用于设置两次自动连续扫码回调之间的最小间隔,单位毫秒,默认 1200。用户手动点选多码结果时不受该间隔限制。

连续扫码时从相册选取图片识别成功后,会触发一次 success 回调并继续停留在扫码页;用户关闭扫码页时才会返回已识别内容数组。

主动关闭扫码页

import { closeScan } from '@/uni_modules/s-scan'

const closed = closeScan()
console.log('是否已发起关闭', closed)

closeScan() 会关闭当前正在运行的扫码页,并返回 boolean 表示是否存在可关闭的扫码页。普通扫码会触发取消失败回调,错误码为 1300004;连续扫码会和用户点关闭按钮一样,返回当前已识别结果数组。

参数说明

参数 类型 默认值 说明
scanType Array<string> ['qrCode', 'barCode'] 识别类型,支持 qrCodebarCodedatamatrixpdf417
onlyFromCamera Boolean false 兼容 uni.scanCode 字段。为 true 时隐藏相册入口,只允许相机扫码
title String 扫码 扫码页标题
titleStyle.color String #FFFFFF 标题颜色
titleStyle.fontSize Number 18 标题字号,Android 为 sp,iOS 为 pt
content String 将二维码或条形码放入屏幕内 扫码提示内容
prompt String - 兼容旧参数,content 优先级更高
contentStyle.color String #FFFFFF 提示文字颜色
contentStyle.fontSize Number 15 提示文字字号
contentStyle.backgroundColor String 空字符串 提示背景色,例如 #66000000
vibrate Boolean false 扫码成功后是否震动
beep Boolean false 扫码成功后是否播放 Beep 音
manualSelect Boolean true 同时识别多个码时,是否显示箭头让用户手动选择
scanLineColor String #07C160 扫描线颜色
flashlightActiveColor String scanLineColor 手电筒开启时的图标颜色
autoZoom Boolean true 是否启用温和自动缩放,便于识别远距离或较小的码
pinchZoom Boolean true 是否允许双指捏合手势手动放大或缩小扫码画面
showFlashlight Boolean true 是否显示手电筒按钮
showAlbum Boolean true 是否显示相册按钮
continuous Boolean false 是否连续扫码。开启后每次识别都会回调 success,扫码页不自动关闭
deduplicate Boolean false 连续扫码时是否按内容去重。为 true 时相同内容只回调并汇总一次
showSuccessTip Boolean true 连续扫码成功后是否显示轻量成功提示
successTipText String 扫描成功 连续扫码成功后轻量提示的文案。传空字符串时使用默认文案
scanInterval Number 1200 自动连续扫码两次回调之间的最小间隔,单位毫秒。设置为 0 表示不限制;手动点选多码结果不受该间隔限制
success Function - 扫码成功回调
fail Function - 扫码失败回调
complete Function - 调用结束回调,成功或失败都会执行

返回值

type ScanCodeSuccess = {
  result: string | string[]
  scanType: string
  rawScanType?: string
  fromAlbum?: boolean
  charSet?: string
}
字段 说明
result 扫码内容。普通扫码为 string;连续扫码关闭页面时为已识别内容的 string[]
scanType 规范化后的码类型,例如 QR_CODEEAN_13
rawScanType 原生平台返回的码类型
fromAlbum 是否来自相册
charSet 固定为 UTF-8

错误码

错误码 说明
1300001 相机权限被拒绝
1300002 相机不可用
1300003 已经有扫码页正在运行
1300004 用户取消扫码
1300005 扫码失败

权限配置

Android 插件已声明以下权限:

  • android.permission.CAMERA
  • android.permission.VIBRATE
  • android.permission.READ_EXTERNAL_STORAGE
  • android.permission.READ_MEDIA_IMAGES

iOS 需要在 manifest.json 中配置相机和相册用途说明:

{
  "NSCameraUsageDescription": "需要使用相机扫描二维码或条形码",
  "NSPhotoLibraryUsageDescription": "需要访问相册以识别图片中的二维码或条形码"
}

示例工程已内置以上配置,接入业务项目时请按项目实际文案调整。

注意事项

  • 本插件仅支持 App Android 和 App iOS,H5 和小程序端不会启用原生扫码能力。
  • content 为空字符串时,扫码页不会显示提示文字,也不会显示提示背景。
  • onlyFromCameratrue 时会隐藏相册入口;如果同时设置了 showAlbum: true,仍以 onlyFromCamera 为准。
  • pinchZoom 开启后,用户双指缩放会优先使用手动倍率,本次扫码中 autoZoom 不会继续覆盖用户设置。
  • 多码选择的箭头位置来自原生识别框坐标。识别到多个候选码时,插件会短暂聚合候选、冻结摄像头画面,并将左上角按钮变为“取消”,由用户点选目标码。
  • 连续扫码模式下,插件不会自动关闭扫码页;相册识别成功后会继续停留在扫码页,用户点左上角关闭时会返回已识别内容数组。
  • Android 相册识别依赖系统图库返回图片 URI;部分定制 ROM 的图库如果不返回标准图片 URI,可能无法识别。

隐私、权限声明

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

android.permission.CAMERA, android.permission.VIBRATE, android.permission.READ_EXTERNAL_STORAGE, android.permission.READ_MEDIA_IMAGES

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

插件不采集用户数据;扫码结果仅通过 success / Promise 回调返回给业务代码。

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