You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Tesseract-OCR实现相机拍照OCR时遇数据路径不存在错误

解决Tesseract-OCR初始化时「Data path does not exist!」的问题

这个错误本质是Tesseract找不到存放语言包的有效路径——它没法直接读取assets里的文件,必须把语言包复制到设备的本地可读写目录才行,我给你一步步捋清楚怎么解决:

1. 先检查你的assets文件结构是否正确

你需要在app/src/main/assets下创建一个tessdata子文件夹,把对应的语言包(比如eng.traineddata,识别英文用)放进去,最终路径应该是:
app/src/main/assets/tessdata/eng.traineddata

注意:语言包的文件名要和你初始化时传的language参数对应,比如你传"eng",就必须有eng.traineddata文件。

2. 把assets里的语言包复制到应用私有存储

因为assets是只读目录,Tesseract需要读写权限,所以我们要把语言包复制到应用的私有存储目录(比如getFilesDir(),这个目录不需要动态申请权限,Android 6.0+也能用)。

在你的MainActivity或者MyTessOCR类里添加复制文件的方法:

private void copyTessDataToLocal() {
    AssetManager assetManager = getAssets();
    String tessDataFolder = "tessdata";
    File localTessDataDir = new File(getFilesDir(), tessDataFolder);

    // 先创建本地tessdata目录
    if (!localTessDataDir.exists()) {
        localTessDataDir.mkdirs();
    }

    try {
        // 获取assets里tessdata文件夹下的所有文件
        String[] files = assetManager.list(tessDataFolder);
        for (String filename : files) {
            // 打开assets里的文件流
            InputStream inStream = assetManager.open(tessDataFolder + "/" + filename);
            // 本地文件路径
            File outFile = new File(localTessDataDir, filename);
            // 复制文件
            OutputStream outStream = new FileOutputStream(outFile);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inStream.read(buffer)) != -1) {
                outStream.write(buffer, 0, length);
            }
            // 关闭流
            inStream.close();
            outStream.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3. 正确初始化Tesseract

在调用mTess.init()之前,先执行上面的复制方法,然后把datapath设置为应用私有存储的根目录(也就是getFilesDir().getAbsolutePath()):

// 先复制语言包到本地
copyTessDataToLocal();
// 设置datapath为应用私有存储根目录
String dataPath = getFilesDir().getAbsolutePath();
// 初始化,第二个参数是语言包前缀(比如eng对应eng.traineddata)
mTess.init(dataPath, "eng");

额外注意点

  • 不要用外部存储路径(比如Environment.getExternalStorageDirectory()),因为Android 10+对外部存储的权限限制很严,用应用私有存储更省心。
  • 第一次启动应用时复制文件可能需要一点时间,你可以加个加载提示,避免用户以为应用卡死。

内容的提问来源于stack exchange,提问作者lovecode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:13:36