更新记录
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 提示音。
- 支持
onlyFromCamera、success、fail、complete等uni.scanCode常用字段。
安装说明
- 在插件市场导入本插件到项目。
- 确认项目已包含
uni_modules/s-scan目录。 - 在需要扫码的页面中按下面示例导入并调用。
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'] |
识别类型,支持 qrCode、barCode、datamatrix、pdf417 |
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_CODE、EAN_13 |
rawScanType |
原生平台返回的码类型 |
fromAlbum |
是否来自相册 |
charSet |
固定为 UTF-8 |
错误码
| 错误码 | 说明 |
|---|---|
1300001 |
相机权限被拒绝 |
1300002 |
相机不可用 |
1300003 |
已经有扫码页正在运行 |
1300004 |
用户取消扫码 |
1300005 |
扫码失败 |
权限配置
Android 插件已声明以下权限:
android.permission.CAMERAandroid.permission.VIBRATEandroid.permission.READ_EXTERNAL_STORAGEandroid.permission.READ_MEDIA_IMAGES
iOS 需要在 manifest.json 中配置相机和相册用途说明:
{
"NSCameraUsageDescription": "需要使用相机扫描二维码或条形码",
"NSPhotoLibraryUsageDescription": "需要访问相册以识别图片中的二维码或条形码"
}
示例工程已内置以上配置,接入业务项目时请按项目实际文案调整。
注意事项
- 本插件仅支持 App Android 和 App iOS,H5 和小程序端不会启用原生扫码能力。
- 当
content为空字符串时,扫码页不会显示提示文字,也不会显示提示背景。 onlyFromCamera为true时会隐藏相册入口;如果同时设置了showAlbum: true,仍以onlyFromCamera为准。pinchZoom开启后,用户双指缩放会优先使用手动倍率,本次扫码中autoZoom不会继续覆盖用户设置。- 多码选择的箭头位置来自原生识别框坐标。识别到多个候选码时,插件会短暂聚合候选、冻结摄像头画面,并将左上角按钮变为“取消”,由用户点选目标码。
- 连续扫码模式下,插件不会自动关闭扫码页;相册识别成功后会继续停留在扫码页,用户点左上角关闭时会返回已识别内容数组。
- Android 相册识别依赖系统图库返回图片 URI;部分定制 ROM 的图库如果不返回标准图片 URI,可能无法识别。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 170
赞赏 2
下载 12450556
赞赏 1935
赞赏
京公网安备:11010802035340号