资讯详情

UniApp 离线 OCR (基于 RapidOcr 的原生模块开发)

📅 2026/10/29 10:59:36 | 华诺云谱 👁 阅读
UniApp 离线 OCR (基于 RapidOcr 的原生模块开发)
UniApp 离线 OCR (基于 RapidOcr 的原生模块开发)一、项目背景移动端 OCR 需求很常见识别身份证、票据、屏幕截图中的文字。主流方案有两种方案代表优点缺点云端 OCR百度、腾讯、阿里 API识别率高需联网、按次收费、数据安全风险端侧 OCRRapidOcrONNX Runtime离线、免费、低延迟模型精度略低、包体增大本项目选择端侧离线 OCRRapidOcr Android底层 ONNX Runtime PP-OCR 模型并需要把它塞进UniApp 离线打包的壳工程里让前端页面通过 JS 调用原生相机识别界面拿到识别结果。1.1 技术栈前端UniApp使用Vue2 语法壳工程AndroidJava Kotlin集成 UniApp SDKuniapp-v8-release.aarOCR 引擎OcrLibrarynative solibRapidOcr.so、libonnxruntime.so支持 x86 / armeabi-v7a / arm64-v8a相机Jetpack CameraX 自定义取景框CameraLensView1.2 整体架构┌──────────────────────────────────────────┐ │ UniApp 页面 (pages/index/index.vue) │ │ weex.requireModule(OCRModule) │ └──────────────┬───────────────────────────┘ │ JS Bridge (UniModule) ┌──────────────▼───────────────────────────┐ │ OCRModule (UnoModule 子类) │ │ getOcrResult(UniJSCallback) │ └──────────────┬───────────────────────────┘ │ 静态 Holder 中转 ┌──────────────▼───────────────────────────┐ │ OcrResultHolder (static result/timeMs) │ └──────────────┬───────────────────────────┘ │ 静态方法读写 ┌──────────────▼───────────────────────────┐ │ CameraActivity (CameraX 预览 OCR识别) │ │ OcrEngine (Kotlin 单例, native 加速) │ └──────────────────────────────────────────┘主要识别流程UniApp 拉起原生 Activity → Activity 拍照识别 → 结果写入静态 Holder → Activity finish → UniApp 页面轮询 Holder 拿结果。二、数据传递流程原生 Activity 与 UniModule 之间没有直接引用关系需要做一个静态数据中转publicclassOcrResultHolder{privatestaticStringlastResult;privatestaticintlastTimeMs0;publicstaticvoidsetResult(Stringresult,inttimeMs){lastResultresult;lastTimeMstimeMs;}/** 读取结果并自动清除读取即消费 */publicstaticStringgetLastResult(){StringrlastResult;lastResult;returnr;}publicstaticintgetLastTimeMs(){inttlastTimeMs;lastTimeMs0;returnt;}}将数据传回js端UniJSMethod(uiThreadtrue)publicvoidgetOcrResult(UniJSCallbackcallback){MapString,ObjectdatanewHashMap(4);StringresultOcrResultHolder.getLastResult();inttimeMsOcrResultHolder.getLastTimeMs();data.put(result,result!null?result:);data.put(timeMs,timeMs);data.put(success,!TextUtils.isEmpty(result));callback.invoke(data);}前端页面获取识别结果checkOcrResult(){try{constmoduleuni.requireNativePlugin(OCRModule)if(!module){console.error([OCR] OCRModule未注册)return}constselfthismodule.getOcrResult(function(res){if(res.successres.resultres.result!){constocrres.result self.ocrTextocr self.ocrTimeres.timeMs uni.showToast({title:OCR成功:res.result,icon:none})}else{console.log([OCR] 无可用结果)}})}catch(e){console.error([OCR] 读取结果失败,JSON.stringify(e))uni.showToast({title:读取OCR结果失败,icon:none})}}三、项目总结通过本次基于 RapidOcr 的 UniApp 离线 OCR 原生模块开发我们可以得出以下几点经验1.采用混合开发利用 UniModule 结合静态数据中转类 (OcrResultHolder) 的设计模式完美解决了跨语言及不同生命周期组件间异步通信的痛点确保了原生相机扫描结果能够无缝、安全地回传至前端页面。2.兼顾性能与数据安全采用端侧离线运行模式ONNX Runtime PP-OCR 模型不仅彻底摆脱了对外部网络环境的依赖、节省了长期的云端 API 商业调用成本更从根本上保障了敏感文本如身份证、票据等的本地化隐私安全。高扩展与高复用性四、资源下载以下地址提供完整的项目源码欢迎点赞、收藏、下载交流点击分享内容即可下载https://pan.quark.cn/s/b60c184772c2
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑