更新记录
1.0.0(2026-10-21)
首次发布
- 提供 Android / iOS / HarmonyOS 三端统一的本机图片文字识别:Android 用 ML Kit 内置模型(
text-recognition拉丁档 +text-recognition-chinese中英档)、iOS 用系统 Vision 的VNRecognizeTextRequest、HarmonyOS 用系统 Core Vision Kit 的textRecognition.recognizeText。三端全程离线,不发起任何网络请求、不上传图片。 - API 为 uni 风格
options入参 +success / fail / complete回调,返回void:recognizeText识别、warmup预热引擎句柄、releaseEngine释放句柄、getEnvInfo同步查本端能力。 - 结果口径:
text整段文本(块间换行、块内行以空格拼接)+blocks按块分组 +lines逐行(text、blockIndex、confidence、四角点points),并给出送入引擎尺寸width/height与原图尺寸sourceWidth/sourceHeight。三端坐标统一换算为「左上角为原点、以原图为基准的像素坐标」,换算只在core.uts写一遍。 lang支持auto(中英混排)/zh/en,mode支持accurate/fast(档位只有 iOS 的引擎有)。显式传入本端不支持的语言或档位一律返回9060008,不静默忽略;getEnvInfo().languages / modes是本端真实可选值。maxSide长边降采样开关(默认 0 按原图),timeout看门狗(默认 15000ms,允许 1000–120000,越界夹边界),到点回9060007并作废之后迟到的引擎结果。- 单飞保护:同一时刻只允许一次识别,重复调用回
9060005;成功、失败、超时三路结算由core.uts的OcrSettler收口,保证一次调用只结算一次。 - 错误码段位
9060,序号 001–009,009 固定为「当前平台不支持」;三端原生错误码体系不同,厂商原始码不占段位,统一归类后把原始码与文案拼进errMsg。 - Web / 小程序等没有原生识别引擎的端走
utssdk/index.uts兜底:recognizeText / warmup / releaseEngine返回9060009,getEnvInfo照常可用并把engine标记为none。 - 三端真机验收通过:Android / iOS / HarmonyOS 的 uni-app(vue2、vue3)与 uni-app-x 工程跑通案例页全部能力。
- HarmonyOS 直接支持
uni.chooseImage回到的媒体库 URI(file://media/...):本端整条透传给系统文件接口,不需要业务先uni.saveFile落沙盒;读字节改为「先 open、再按 fd 取大小」,因为媒体 URI 不支持按路径 stat,这样沙盒路径与 URI 两个通道共用一份代码。 - 不申请任何运行时权限、不随插件提供 AndroidManifest.xml 与 Info.plist:图片由业务侧用
uni.chooseImage/uni.chooseMedia/uni.saveFile取得本机路径后传入,插件只读该路径。 - 案例页只留功能:顶部大字识别结果 + 「选图即识别」主操作,逐行结果(置信度与四角点)跟在下面。能力探测在
onLoad、引擎预热在首次识别前、句柄释放在onUnload自动完成,不再摆环境/生命周期按钮;错误码如实显示在调用那一行。样式全走行内:style(鸿蒙不把页面级 css 打进包)。 - 附
license.txt授权条款:普通授权与源码授权两档(与package.json的dcloudext.sale对应),写明授权主体、源码不得再分发、支持边界与免责;readme 标题段指向该文件。
平台兼容性
uni-app(4.75)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | √ | 5.0 | 15 | 12 |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.75)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | 5.0 | 15 | 12 | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
bear-ocr
用设备上的离线文字识别引擎识别本机图片里的文字,回整段文本、逐行文本与四角点坐标;支持 Android、iOS、HarmonyOS,全程不联网、不上传图片。
不申请任何运行时权限,图片路径由业务侧自己取得。收费插件,普通授权与源码授权两档,权利边界见 license.txt。
兼容性
| 平台 | 支持 | 引擎 | 最低版本 | 语言 | 档位 | 说明 |
|---|---|---|---|---|---|---|
| Android | √ | Google ML Kit 内置模型(离线,含中文包) | minSdk 21 | auto / zh / en | accurate | 需云端自定义基座,见「使用前提」1 |
| iOS | √ | 系统 Vision VNRecognizeTextRequest |
deploymentTarget 15 | auto / zh / en | accurate / fast | 唯一有 fast 档的端 |
| HarmonyOS | √ | 系统 Core Vision Kit textRecognition |
API 12(HarmonyOS NEXT) | auto(引擎自动判定) | accurate | 该引擎只在国内正规真机可用,模拟器不支持,见「使用前提」6 |
| Web / 小程序 | × | 无原生引擎 | - | - | - | 走 utssdk/index.uts 兜底,调用返回 9060009,getEnvInfo 仍可用(engine 为 none) |
三端都纯端侧执行、不发起网络请求,也不依赖任何在线 OCR 服务。uni-app 与 uni-app-x 共用同一份原生实现,最低版本一致。运行环境:HBuilderX 4.44+、uni-app / uni-app-x 4.75+。数值与 package.json 矩阵、各端 config.json 逐项一致。
验收口径:uni-app(vue2 与 vue3)与 uni-app-x 工程,在 Android / iOS / HarmonyOS 三端真机跑通案例页全部能力。
使用前提
- Android 必须用云端自定义基座验收。
config.json声明了 ML Kit 的 Maven 依赖(text-recognition与text-recognition-chinese),本地标准基座不解析这类依赖,直接「运行到手机或模拟器」会在生成的index.kt报找不到名称“com.google”并附官方 known-issue 链接——这是环境限制,不要为此改动依赖声明(依据:DCloud 官方「带第三方依赖的 UTS 插件需云端编译」口径)。iOS 与 HarmonyOS 走系统框架,无此症状但同样需要自定义基座(UTS 插件不参与标准基座)。 - 中文识别会增大 APK 体积:
lang为auto或zh时用中文档模型,只走纯拉丁(lang: 'en')可以少带那一包。具体增量以你自己的云打包产物为准。 - 不需要任何权限:本插件不申请运行时权限,也不随插件提供
AndroidManifest.xml与Info.plist。图片由业务侧用uni.chooseImage/uni.chooseMedia取得,选图阶段的相册/相机权限由宿主与系统决定,与本插件无关。 path只接受本机可读路径:支持_doc/、_downloads/、_temp/、沙盒相对路径、file://前缀,以及 HarmonyOS 上uni.chooseImage直接回到的媒体库 URI(file://media/...,本端整条透传给系统文件接口,无需先uni.saveFile落沙盒)。网络地址不支持,读不到字节时回9060003,errMsg会同时给出入参原文与展开后的路径。- 一次只跑一个识别:识别尚未结束时再次调用返回
9060005,需要连续识别请等上一次回调。 - HarmonyOS 的两条硬限制:该端引擎只在国内正规真机可用,模拟器与海外机型会在初始化阶段回
9060002;图片边长有接口级判定(短边 ≥ 100、宽 ≤ 10000、高 ≤ 15210),越界回9060003,用maxSide主动降采样即可避开上限。下限以下无法放大,只能换更大的图。 - 语言与档位按端不同:
getEnvInfo().languages/modes是本端真实可选值,显式传入本端不支持的取值返回9060008(不静默忽略)。拼错的语言名与档位不报错,按默认值处理。
快速开始
<script setup>
import { ref } from 'vue'
import { recognizeText, getEnvInfo } from '@/uni_modules/bear-ocr'
const text = ref('')
function pickAndRecognize() {
uni.chooseImage({
count: 1,
success: (choose) => {
const path = choose.tempFilePaths[0]
recognizeText({
path: path,
lang: 'zh',
maxSide: 1600,
success: (res) => {
// res.data:整段文本、逐行文本与四角点坐标
const data = res.data
if (data == null) return
text.value = data.text
console.log('语言', data.language, '耗时', data.duration, 'ms', '共', data.lines.length, '行')
},
fail: (err) => {
console.log('识别失败', err.errCode, err.errMsg)
}
})
}
})
}
console.log(getEnvInfo()) // 同步返回,本端支持哪些语言与档位
</script>
import 只允许写到插件根目录
@/uni_modules/bear-ocr,MUST NOT 指到utssdk/下的文件。
API
| 方法 | 同步/异步 | 说明 |
|---|---|---|
getEnvInfo() |
同步 | 查本端引擎能力,不会失败 |
recognizeText(options) |
异步 | 识别一张本机图片的文字 |
warmup(options?) |
异步 | 把引擎初始化耗时从首次识别里挪走 |
releaseEngine(options?) |
异步 | 释放引擎并复位就绪状态,页面退出时调用 |
getEnvInfo() : OcrEnv
同步返回运行环境与本端真实能力,不需要权限、不会失败。
| 字段 | 类型 | 说明 |
|---|---|---|
| platform | string | android / ios / harmony;无原生引擎的端回 uni 的 osName |
| systemVersion | string | Android 为 API level,iOS 为系统版本,鸿蒙为 osFullName |
| deviceBrand | string | 设备品牌;iOS 回机型名(iPhone / iPad),取不到为 '' |
| engine | string | mlkit-chinese / mlkit-latin / vision / core-vision / none。判本端有无原生引擎就判 engine != 'none' |
| languages | Array\<string> | 本端可选语言口径,含 auto;鸿蒙恒为 ['auto'] |
| modes | Array\<string> | 本端真实生效的档位;Android 与鸿蒙恒为 ['accurate'] |
| engineReady | boolean | 引擎句柄是否已创建(warmup 成功后为 true) |
| offline | boolean | 是否纯端侧识别,三端原生引擎恒为 true |
| maxImageSide | number | 引擎可接受的长边上限,0 表示无硬性限制;鸿蒙为 10000 |
| minImageSide | number | 引擎可接受的短边下限,0 表示无硬性限制;鸿蒙为 100,低于该值该端判 9060003 |
recognizeText(options)
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| path | string | - | 必填,本机图片路径。去空格后为空返回 9060001 |
| lang | string | 'auto' | auto 中英混排 / zh 中英档 / en 纯拉丁档(更快)。拼错的语言名按 auto 处理;本端不支持显式指定的语言返回 9060008 |
| mode | string | 'accurate' | accurate / fast,只影响速度不影响可选语言。仅 iOS 有 fast,在另外两端显式传 fast 返回 9060008 |
| maxSide | number | 0 | 长边上限,0 按原图识别;正数时长边超出会先等比降采样再识别(提速、避开大图限制) |
| timeout | number | 15000 | 看门狗超时(ms),允许 1000–120000,越界夹到边界。到点引擎仍未回结果返回 9060007,之后的结果丢弃 |
| success | (res: OcrResult) => void | - | 识别成功回调 |
| fail | (err: OcrFail) => void | - | 失败回调,errCode 为 9060xxx,errMsg 里带引擎原始码与文案 |
| complete | (res: any) => void | - | 完成回调,成功回 OcrResult、失败回 OcrFail |
OcrResult:
| 字段 | 类型 | 说明 |
|---|---|---|
| code | number | 固定 0 |
| msg | string | success |
| data | OcrData | null | 识别数据。图上没文字时走 success,text 为空串、lines 为空数组 |
OcrData:
| 字段 | 类型 | 说明 |
|---|---|---|
| text | string | 整段文本:各块以换行拼接,块内各行以空格拼接 |
| blocks | Array\<OcrBlock> | 按块分组的结果,做排版还原时用 |
| lines | Array\<OcrLine> | 全部行的扁平数组,按识别顺序;只要纯文本行时用 |
| engine | string | 实际使用的引擎标识,口径同 OcrEnv.engine |
| language | string | 实际生效的语言口径;鸿蒙由引擎自动判定,恒回 auto |
| width / height | number | 送入引擎的图宽/图高(传 maxSide 时为缩放后的尺寸) |
| sourceWidth / sourceHeight | number | 原图宽/高,points 已按该尺寸换算回原图坐标 |
| duration | number | 引擎耗时(ms),不含选图与线程调度等待 |
OcrLine:
| 字段 | 类型 | 说明 |
|---|---|---|
| text | string | 行内文本 |
| blockIndex | number | 该行所属块序号,从 0 开始;iOS 端所有行同属 0 块 |
| confidence | number | 置信度 0–1;鸿蒙的引擎不给行级置信度,固定回 0 |
| points | Array\<OcrPoint> | 四角点,顺序固定为左上、右上、右下、左下,单位像素、以原图为基准;端上几何信息缺失时为空数组 |
OcrBlock:text(块内各行按识别顺序以空格拼接)、lines(块内的行)。OcrPoint:x、y。
warmup(options?)
把引擎初始化耗时从首次识别里挪走:Android 创建并缓存 ML Kit 识别器,HarmonyOS 调 textRecognition.init(),iOS 的 Vision 没有常驻句柄、用一张 1x1 空图同步预跑一次请求。可只传回调,lang 决定预热哪一档。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| lang | string | 'auto' | 语言口径,与 recognizeText 的 lang 同一套取值;本端不支持返回 9060008 |
| success / fail / complete | function | - | uni 风格回调 |
OcrEngineState:ready(句柄是否就绪)、engine(引擎标识)、duration(本次调用耗时,ms;Android 与 HarmonyOS 已预热过时为 0,iOS 每次都真跑一次空图所以始终大于 0)。引擎创建失败返回 9060002。
iOS 这一跳同步阻塞调用线程(主线程),是 warmup 契约里明说的行为——不阻塞就拿不到「首次耗时已被挪走」这个效果,所以建议放在进入识别页时调一次,不要放循环里。
releaseEngine(options?)
释放引擎并复位 engineReady,下次识别会重新初始化。页面 onUnload 或退出识别场景时调用;Android 关闭识别器、HarmonyOS 调 textRecognition.release()、iOS 只复位预热标记。没有可释放的句柄时返回 9060004(不算异常,按业务需要忽略即可)。参数与回调同 warmup,成功结果同样是 OcrEngineState(ready 为 false)。
错误码
错误码以 90 开头,本插件占 9060 段位,序号 009 固定表示「当前平台不支持」。原生引擎的原始码不占段位,会拼在 errMsg 末尾(native code= 或厂商码文案)。
| errCode | 说明 |
|---|---|
| 9060001 | 识别参数错误:path 为空 |
| 9060002 | 识别引擎初始化失败:原生识别器创建失败、鸿蒙 init() 未通过(该端引擎需国行真机) |
| 9060003 | 图片读取或解码失败:文件不存在、格式不支持、解码失败、尺寸超出本端上下限 |
| 9060004 | 当前没有可释放的识别引擎 |
| 9060005 | 上一次识别尚未结束 |
| 9060006 | 文字识别失败:引擎回了未归类错误,errMsg 带原生码与文案 |
| 9060007 | 识别超时:看门狗到点引擎仍未回结果 |
| 9060008 | 该语言或档位在本端不支持(显式传了 lang / mode 且本端没有这一档) |
| 9060009 | 当前平台不支持:Web / 小程序等没有原生识别引擎的端 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 16
赞赏 0
下载 12700970
赞赏 1956
赞赏
京公网安备:11010802035340号