uni.scanCode不能自动填充,它返回扫码结果后需手动赋值给输入框;真正在App端实现“扫完即填”需通过plus.android/ios调用原生扫描能力。

App端直接调用uni.scanCode就能自动填充?别信
不能。uni.scanCode 是一个阻塞式、全屏系统扫码页,它不会“自动填充”到某个输入框,而是返回结果后由你手动处理。所谓“自动填充”,其实是你拿到 res.result 后,主动赋值给目标 input 或 v-model 变量。很多开发者误以为调一次 API 就能像 PDA 那样扫完立刻填进框里,这是对 API 行为的误解。
它的典型流程是:用户点击按钮 → 跳转全屏扫码界面 → 对准二维码 → 识别成功 → 关闭扫码页 → 回到原页面执行 success 回调 → 你再把 res.result 赋给表单字段。
- 不支持后台持续扫描,每次调用都打开新页面
- 无法自定义扫码区域或叠加 UI(比如手电筒开关、手动输入提示)
- 在 iOS 上若未提前申请权限,可能静默失败,无任何提示
想真正在App端实现“扫完即填”,得绕开uni.scanCode
如果你需要的是工业级体验——比如仓库扫码入库时,PDA 扫一下,光标还在输入框里,内容就自动填入并触发校验——那必须走原生层通信。UniApp 提供了 plus.android 和 plus.ios 接口,可监听系统广播或注册原生扫描回调。
以东大 PDA 为例,它默认通过 Android 广播发送扫码结果,Action 是 com.android.server.scannerservice.broadcast,数据键名为 scannerdata。你需要:
- 在页面
onLoad中用plus.android.importClass导入IntentFilter和广播接收器 - 用
plus.android.registerBroadcastReceiver注册监听 - 在
onReceive回调里提取intent.getStringExtra('scannerdata') - 拿到字符串后,直接更新
this.form.code或触发input事件
注意:这个方案只适用于已集成扫描硬件的 Android PDA 设备,普通手机摄像头不发这类广播。
uni.scanCode 在 App 端的参数陷阱和兼容性细节
很多人写完代码发现安卓能扫、iOS 不行,或者扫出来是乱码,问题常出在参数配置上。关键点不是“有没有写”,而是“怎么写”:
-
scanType必须显式传数组,如['qrCode', 'barCode'];传字符串'qrCode'在 iOS 上会失效 -
onlyFromCamera: true在部分华为/小米机型上会导致黑屏,建议设为false并在 UI 上引导用户“请使用相机扫码” -
success回调里的res.result在安卓上是原始字符串,在 iOS 上可能带换行符或空格,务必用.trim()处理 - 如果扫码后需跳转,不要在
success里直接uni.navigateTo,先uni.hideLoading()或加await uni.nextTick(),否则在低端安卓机上可能出现白屏
H5 和 App 混用扫码逻辑?别共用同一套调用代码
很多团队试图写个 “跨平台扫码函数”,里面用 if (uni.getSystemInfoSync().platform === 'h5') 分支处理。这看似聪明,实则埋雷:
- H5 环境下
uni.scanCode直接报错not supported,且无法捕获,会中断后续 JS 执行 - App 端依赖原生能力,H5 端依赖
getUserMedia + jsQR,两套流程的数据流、错误处理、UI 控制完全不同 - 更稳妥的做法是:用
uni.getSystemInfoSync().platform做环境判断,但把扫码逻辑完全拆成两个独立模块,分别维护
真正容易被忽略的点是:App 端扫码后页面栈状态、软键盘是否弹起、输入框焦点是否丢失——这些在 H5 里根本不存在,但在线上 App 中频繁导致用户重复扫码、填错字段。


















