应直接替换uni.scanCode,因其底层ZXing库缺乏商业级优化,参数调优无法弥补30%以上识别率缺口;Android需预授权并检查权限链,H5必须用html5-qrcode等替代方案。

直接换掉 uni.scanCode,别在参数上反复调了——它底层用的是 ZXing 开源库,算法没做商业级优化,再怎么开 autoZoom 或加 scanType 也补不回 30% 以上的识别率缺口。
Android 上扫码失败率高,优先检查权限链和预授权时机
Android 端扫码卡住、黑屏、点不动,90% 是权限没走通闭环。iOS 可以等用户点按钮再弹窗,Android 必须提前“预占”权限,否则首次调用会静默失败。
-
uni.getSetting检查到scope.camera为undefined时,立刻走uni.authorize({ scope: 'scope.camera' }),不要等用户点扫码按钮才触发 - 授权失败后,必须调用
uni.openSetting()跳转系统设置页——iOS 不支持这步,但 Android 用户几乎都依赖它找回权限 - manifest.json 中除了声明
"scope.camera",还得加<uses-feature android:name="android.hardware.camera" />,否则某些华为/小米机型会直接屏蔽安装入口
H5 页面扫码白屏或报错 NotAllowedError
不是代码写错了,是协议或环境不合法。浏览器强制要求摄像头访问必须运行在安全上下文里,HTTP 协议下必挂,localhost 下也可能被拦截。
- 线上部署必须用 HTTPS,哪怕自签名证书也行,但不能是 HTTP
- 本地开发用 Vite 的话,在
vite.config.js里加@vitejs/plugin-basic-ssl插件,启动后访问https://localhost:5173(注意端口) - 别用
uni.scanCode去碰 H5——它在浏览器里根本不可用,得换html5-qrcode这类纯前端方案,且要手动控制 video 元素的playsinline和autoplay属性
识别率卡在 60%~70%,说明还在用开源解码器硬扛
ZXing 对带 Logo、倾斜、模糊、弱光二维码的容忍度天然偏低。实测数据很明确:同一张破损 30% 的二维码,uni.scanCode 成功率 42%,mPaaS 插件是 85%——这不是调参能抹平的差距。
- 放弃魔改
uni.scanCode,直接接入阿里云 mPaaS 扫码插件(ID 2636),它复用了支付宝同源引擎,支持 GPU 加速预处理 - 接入后必须填对三个值:
AppID、WorkspaceID、License,全在下载的.config文件里,手输错一个就初始化失败,控制台无报错但mpaasScanModule为undefined - 调用时别漏掉
hideAlbum: true,否则安卓上相册入口会遮挡扫码框,用户误点相册导致流程中断
真正难的不是集成步骤,而是意识到:扫码不是“调个 API 就完事”的功能,它是横跨权限模型、硬件抽象层、图像解码算法的链路。很多团队卡在“为什么我开了 autoZoom 还是扫不出”,其实问题早就不在 JS 层了。


















