uni-app x uni.scanCode 扫码 API 完全指南:参数、跨端实现原理与实战示例
uni-app x uni.scanCode 扫码 API 完全指南参数、跨端实现原理与实战示例【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-appuni-app x 提供的uni.scanCode是调用系统扫码能力一维码与二维码的统一接口。本文以 docs/api/scan-code.md 为核心结合仓库内 uni-scanCode 模块源码、uni-camera 组件 与 示例页面系统讲解 API 的参数定义、各平台实现差异、调用链原理与权限注意事项帮助读者在 AppAndroid/iOS/HarmonyOS和小程序平台上快速落地扫一扫功能。一、API 概览与平台兼容性uni.scanCode(options?)用于唤起扫码界面扫描一维码条形码和二维码通过回调返回识别结果。它的底层实现是一个开源的 uvue 页面页面内嵌了camera组件由 camera 组件提供扫码模式鸿蒙和小程序平台则直接调用平台自身提供的扫码 API。| 平台 | 兼容性 | 备注 | | :- | :- | :- | | Web | x | 不支持 | | 微信小程序 | 4.41 | 直接调用 wx.scanCodeUI 不可自定义 | | Android | 4.71 | 基于 camera 组件的自绘扫码界面 | | iOS | 4.71 | 基于 camera 组件的自绘扫码界面 | | HarmonyOS | 4.61 | 直接调用系统 Scan KitUI 不可自定义 |兼容性版本信息以 docs/api/scan-code.md 文档与 interface.uts 中的 uniPlatform 标注 为准。从接口标注还可以看到该 API 在 Android/iOS 上不仅支持 uni-app xunix 4.71也支持传统 uni-appuniVer 为 √微信小程序端 uniVer 同样为 √即 uni-app 和 uni-app x 均可用。二、参数详解ScanCodeOptionsoptions的类型为ScanCodeOptions所有字段均为可选兼容性列中的 Web: x 表示 Web 平台不支持该 API。| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | onlyFromCamera | boolean | 否 | 是否只能从相机扫码不允许从相册选择图片 | | scanType | Arraystring | 否 | 扫码类型可组合多个 | | success | (res: ScanCodeSuccess) void | 否 | 成功回调 | | fail | (res: ScanCodeFail) void | 否 | 失败回调 | | complete | (res: any) void | 否 | 完成回调成功、失败都会执行 |对应到 interface.uts 中的类型定义onlyFromCamera与scanType均允许传入null回调同样以| null声明为可空调用时可以只传需要的字段。scanType 合法值| 合法值 | 说明 | 兼容性 | | :- | :- | :- | | barCode | 一维条形码 | Web: x; 微信小程序: 4.41; Android: 4.71; iOS: 4.71; HarmonyOS: 4.61 | | qrCode | 二维码 | 同上 | | datamatrix | Data Matrix 码 | 同上 | | pdf417 | PDF417 码 | 同上 |在源码中这四个合法值被定义为联合类型ScanCodeSupportedTypes见 interface.uts。需要注意默认不传 scanType 时识别全部类型传了之后只识别指定类型。这一行为在三个平台实现中均有体现Android/iOS 的入口函数将传入的 scanType 用逗号拼接成 query 参数传给扫码页见 app-android/index.uts页面解析时通过isSupportedScanType过滤非法值HarmonyOS 实现中若解析后scanTypes.length 0则回退为[scanCore.ScanType.ALL]见 app-harmony/index.uts。ScanCodeSuccess 返回值| 名称 | 类型 | 必备 | 描述 | | :- | :- | :- | :- | | result | string | 是 | 识别到的码内容 | | scanType | string | 是 | 识别到的码类型 | | charSet | string | 否 | 所扫码的字符集微信小程序 4.41 支持 | | path | string | 否 | 当所扫的码为当前小程序二维码时返回二维码携带的 path微信小程序 4.41 支持 | | rawData | string | 否 | 原始数据base64 编码微信小程序 4.41 支持 |需要说明的是App 端Android/iOS的ScanCodeSuccess类型在接口文件中仅声明了result与scanType两个必备字段见 interface.uts但扫码页在emitSuccess时会额外携带charset、rawData、scanArea等扩展信息见 scanCode.uvue这些字段通过 UTSJSONObject 透传给回调属于平台实现细节。三、快速上手最小可用示例以下是 hello uni-app x 的官方示例页面 的完整代码与 scan-code.md 文档示例 一致可直接复制使用template view page-head :titletitle/page-head view classuni-padding-wrap uni-common-mt view classuni-title扫码结果/view view v-ifresult classscan-result {{result}} /view view classuni-btn-v button typeprimary clickscan扫一扫/button /view /view /view /template script setup languts const title ref(scanCode) const result ref() const scan () { uni.scanCode({ success: (res: ScanCodeSuccess) { console.log(res: , res); result.value res.result }, fail: (err: ScanCodeFail) { console.log(err: , err); // 需要注意的是小程序扫码不需要申请相机权限 } }); } /script style .scan-result { min-height: 25px; line-height: 25px; } /style要点解读回调类型为ScanCodeSuccess/ScanCodeFail在 uts 中可直接作为类型标注使用该 API不支持 Web需运行到 App 平台体验小程序平台扫码不需要申请相机权限微信小程序扫码由宿主 App 提供能力。进阶限制扫码类型与相册uni.scanCode({ onlyFromCamera: true, // 只允许相机扫码隐藏相册入口 scanType: [qrCode, barCode], // 只识别二维码和一维码 success: (res: ScanCodeSuccess) { console.log(识别结果, res.result, 类型, res.scanType) }, fail: (err) { console.log(扫码失败) }, complete: () { console.log(流程结束) } })从源码可以确认参数的实际走向onlyFromCamera通过 query 传给扫码页后控制相册按钮isShowAlbum的显隐isShowAlbum.value (options[onlyFromCamera] as string) ! true见 scanCode.uvue 的initPageOptions在 HarmonyOS 端则映射为 Scan Kit 的enableAlbum: !options.onlyFromCamera见 app-harmony/index.uts。四、App 端实现原理从 API 调用到 camera 组件的调用链4.1 一个开源的 uvue 扫码页面uni-app x 的扫码 API 本质上是一个uni_modules 模块 对话框页面。调用链如下以 Android/iOS 为例见 app-android/index.uts 与 app-ios/index.uts生成随机uuid构造事件名uni_scan_code_${uuid}_success与..._fail并用uni.$on注册回调调用uni.openDialogPage打开 pages/scanCode/scanCode.uvue以 query 形式传入successEventName、failEventName、onlyFromCamera与scanType扫码页内嵌camera组件resolutionhigh、frame-sizelarge支持flash手电筒并在initdone后启动帧分析startAnalysis()识别成功后页面uni.$emit事件 → 入口函数回调中还原ScanCodeSuccess并依次触发success、complete失败则触发fail、completeuni.openDialogPage打开失败时会通过uni.$off清理已注册的事件监听避免泄漏。4.2 帧识别ML Kit / MLKit 驱动从 scanCode.uvue 的 startAnalysis 可以看到页面通过uni.createCameraContext()订阅相机原始帧onAndroidCameraOriginalFrame/onIosCameraOriginalFrame再把帧交给扫描器处理Android构造AndroidFrameScannerOptions含imageProxy、scanType、autoZoom等调用getAndroidScanner()?.processScanBarCode(options)iOS构造IosFrameScannerOptions含CMSampleBuffer调用getIosScanner()?.processScanBarCode(options)。扫描器来自依赖模块 uni-barcode-scanning其职责是实现 camera 组件modescanCode时的扫码能力仅 Android/iOS 支持。依赖库版本来自 docs/api/scan-code.mdAndroidandroidx.camera:camera-core:1.4.1、com.google.mlkit:barcode-scanning:17.2.0、com.github.albfernandez:juniversalchardet:2.0.4后者用于字符集探测对应返回值中的 charSetiOSpod GoogleMLKit/BarcodeScanning, 6.0.0。文档说明Android/iOS 平台的扫码基于Google 机器学习库对各种一维、二维码都有较好的识别效果。4.3 多码识别与选择 UI当一帧中出现多个码时扫码页会冻结当前帧画面在画面上叠加可点击的选择标记marker提示文案随语言环境变化中/英/西/法见 scanCode.uvue 的 i18n 配置用户点选后返回对应结果同时支持双击画面自动变焦setZoom每次放大 1.2 倍、上限为相机maxZoom。相册扫码未设置onlyFromCamera时走uni.chooseImage选图再调用processScanBarCodeWithPhoto识别图片中的码若返回no barcode found则展示图片预览并提示未识别到一维/二维码。五、HarmonyOS 实现基于系统 Scan Kit与 App 端不同HarmonyOS 直接调用系统扫码能力UI 不可自定义但各种一维、二维码均可识别。核心实现见 app-harmony/index.uts通过canIUse(SystemCapability.Multimedia.Scan.Core)判断系统是否支持扫码能力不支持时直接exec.reject(not support)将 uni 的四种扫码类型映射为 Scan Kit 的scanCore.ScanTypeONE_D_CODE、TWO_D_CODE、DATAMATRIX_CODE、PDF417_CODE不传则默认ScanType.ALL调用scanBarcode.startScanForResult(UTSHarmony.getUIAbilityContext()!, scanOptions, callback)拉起系统扫码界面enableMultiMode: true开启多码模式enableAlbum由onlyFromCamera决定系统返回的原始类型如QR_CODE、EAN_13等 20 余种通过UniScanTypeMap归一化映射为统一返回值。六、权限、隐私与合规注意事项相机权限App 端扫码需要摄像头权限扫码界面的相册图标点击后需要相册读取权限。应用商店合规部分 Android 应用商店要求权限申请前进行声明可使用uni-registerRequestPermissionTips插件在权限申请前展示提示。小程序小程序平台直接调用宿主扫码能力无需申请相机权限。连续扫码场景uni.scanCode是一次性交互扫到即返回如需连续扫码如扫码枪式场景推荐改用 camera 组件 的modescanCode模式。参考示例 camera-scan-code.uvue设置:modescanCode并监听scancode事件即可持续收到识别结果。七、常见问题Web 平台为什么不支持文档兼容性表明确标注 Web 为 x浏览器缺乏统一条码识别与相机扫码协议uni-app x 未在 Web 端实现该 API需要在 App 平台运行体验。scanType 传了没效果请确认传入值必须是barCode/qrCode/datamatrix/pdf417四者之一源码会对非法值做过滤App 端为空时默认全类型识别HarmonyOS 端为空时回退ScanType.ALL。微信小程序的 path / rawData 为什么拿不到这两个字段仅当所扫的码为当前小程序二维码时才有 path 值且需微信小程序 4.41rawData为 base64 编码的原始数据与 App 端返回字段集合不同。识别慢或失败怎么办App 端基于 ML Kit / MLKit 帧识别可在光线不足时点击手电筒图标flash: torch补光或双击画面放大相册识别失败no barcode found会给出图片预览提示。八、深入阅读API 文档docs/api/scan-code.md类型与接口定义interface.uts、protocol.utsAndroid 实现app-android/index.utsiOS 实现app-ios/index.utsHarmonyOS 实现app-harmony/index.uts扫码对话框页面源码pages/scanCode/scanCode.uvue官方示例页面pages/API/scan-code/scan-code.uvue连续扫码camera 组件 scanCode 模式camera-scan-code.uvuecamera 组件文档docs/component/camera.md【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

leetcode 题解仓库前缀树(Trie)专题:从三语言模板到六大经典题型实战

leetcode 题解仓库前缀树(Trie)专题:从三语言模板到六大经典题型实战

文档教程知识库 【免费下载链接】leetcode LeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解,记录自己的leetcode解题之路。) 项目地址: https://gitcode.com/gh_mirrors/le/leetcode 点击查看 免费下载 导读 前缀树&#…

2026/9/21 12:15:34 阅读更多 →
男士真的需要备孕吗?

男士真的需要备孕吗?

需要。而且比很多人以为的更重要。备孕长期被当成"女方的事":吃叶酸、测排卵、调身体,几乎都是对准妈妈的叮嘱。但生孩子是两个人的事,男方提供的精子,直接决定了许多关键结果。精子决定胎儿的哪些方面?一是…

2026/9/22 4:08:21 阅读更多 →
达芬奇Pro开发板硬件验证实操:从Ubuntu系统启动到bit文件下载

达芬奇Pro开发板硬件验证实操:从Ubuntu系统启动到bit文件下载

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 9:08:07 阅读更多 →

最新新闻

5种方法解决img文件怎么打开,附最佳实践避坑指南

5种方法解决img文件怎么打开,附最佳实践避坑指南

5种方法解决img文件怎么打开,附最佳实践避坑指南 刚学完代码,拿到一个 .img 文件却打不开?别慌,这不是你的错。 很多开发者都栽在这上面: 学会语法却不知怎么搭项目 。你以为 img 就是网页里那个 <img>…

2026/9/22 4:32:57 阅读更多 →
SQL注入攻击2026最新

SQL注入攻击2026最新

告别SQL注入噩梦:3个真实案例拆解的保姆级教程 官方文档翻了三遍还是搞不清预处理语句的底层逻辑?别慌,这篇保姆级教程就是为你准备的。咱们不整虚的,直接上实战中踩过的深坑和血泪教训。 1. 现象:那些让你半夜惊醒的报错与数据泄露…

2026/9/22 4:32:56 阅读更多 →
机票上有价格吗?解析票价引擎源码最佳实践

机票上有价格吗?解析票价引擎源码最佳实践

机票上有价格吗?解析票价引擎源码最佳实践 很多后端同学接手过票务系统,或者自己搞过类似的价格计算模块,往往面临一个尴尬局面:网上搜来的代码片段,复制进项目直接报错,或者算出来的价格跟预期对不上,完全不知道从哪下手调。这种“代码跑不通,逻辑理…

2026/9/22 4:32:56 阅读更多 →
q飞实战项目避坑指南:3个底层原理让你告别文档迷宫

q飞实战项目避坑指南:3个底层原理让你告别文档迷宫

q飞实战项目避坑指南:3个底层原理让你告别文档迷宫 官方文档翻了三遍还是云里雾里?别怪你笨,是文档本身就没把底层逻辑讲透。很多开发者在落地 q飞 相关的 实战项目 时,最大的痛苦不是代码写不出来,而是根本不知道代码为什么这么写。文档里全是…

2026/9/22 4:32:56 阅读更多 →
手写实现Tug核心逻辑,3步搞定配置卡点

手写实现Tug核心逻辑,3步搞定配置卡点

手写实现Tug核心逻辑,3步搞定配置卡点 刚接手新项目的兄弟,是不是经常被环境配置搞到怀疑人生?明明照着文档敲,还是卡在依赖安装或端口冲突上,半天没跑通一个 Hello…

2026/9/22 4:32:56 阅读更多 →
2017微信真题复盘:大厂面试官的避坑指南与标准答法

2017微信真题复盘:大厂面试官的避坑指南与标准答法

2017微信真题复盘:大厂面试官的避坑指南与标准答法 别再去翻那几百万字的官方文档了,根本抓不住重点。2017年的微信开发规范与接口定义,至今仍是很多后端和全栈工程师面试中的“隐形杀手”。…

2026/9/22 4:31:55 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事&#xff1a;用Flutter给OpenHarmony做一款游戏集合类的App&#xff0c;说白了就是把若干小游戏塞进一个壳里&#xff0c;用统一入口分发。这个方向本身不算新鲜&#xff0c;真正让我花了不少心思的&#xff0c;是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档&#xff0c;最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事&#xff1a;今天在表后面多加了两个空白行&#xff0c;明天给客户交稿前发现整个章节的编号全部错位&#xff0c;光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年&#xff0c;说实话&#xff0c;第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年&#xff0c;流量惨淡、功能臃肿、代码自己都懒得看第二遍之后&#xff0c;我才慢慢琢磨明白一个道理&#xff1a;第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →