我从github下载了一个ocr文本识别器。
我的问题是:我想在不在线的情况下启动我的应用程序,但每次我在手机上安装apk时,它就会开始下载英语和tesseract ocr引擎。
我找到了一个在线指南,上面说我必须在assets文件夹中创建一个名为“tessdata”的文件夹,并将eng.traineddata和osd.traineddata放在这个文件夹中。
我已经试过了,但是当我第一次安装应用程序时,下载过程仍然会开始。
如何使此应用程序完全脱机?

最佳答案

首先,在计算机(YourProjectDirectory\app\src\main)中的项目目录中创建assets文件夹,int这个文件夹创建另一个tessdata文件夹。在tessdata文件夹中放入.traineddata文件,这些文件将在项目开始运行时传输到手机中。您可以下载您的语言HERE的.traineddata文件。
要将.traineddata文件传输到手机,我使用以下代码:

public class TessOCR {
public static final String PACKAGE_NAME = "com.example.dainius.ocr";
public static final String DATA_PATH = Environment
        .getExternalStorageDirectory().toString() + "/AndroidOCR/";
public static final String lang = "eng";

private static final String TAG = "TESSERACT";
private AssetManager assetManager;

private TessBaseAPI mTess;

public TessOCR(AssetManager assetManager) {

    Log.i(TAG, DATA_PATH);

    this.assetManager = assetManager;

    String[] paths = new String[] { DATA_PATH, DATA_PATH + "tessdata/" };

    for (String path : paths) {
        File dir = new File(path);
        if (!dir.exists()) {
            if (!dir.mkdirs()) {
                Log.v(TAG, "ERROR: Creation of directory " + path + " on sdcard failed");
                return;
            } else {
                Log.v(TAG, "Created directory " + path + " on sdcard");
            }
        }
    }

    if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")).exists()) {
        try {
            InputStream in = assetManager.open("tessdata/" + lang + ".traineddata");
            OutputStream out = new FileOutputStream(new File(DATA_PATH + "tessdata/", lang + ".traineddata"));

            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();

            Log.v(TAG, "Copied " + lang + " traineddata");
        } catch (IOException e) {
            Log.e(TAG, "Was unable to copy " + lang + " traineddata " + e.toString());
        }
    }

    mTess = new TessBaseAPI();
    mTess.setDebug(true);
    mTess.init(DATA_PATH, lang);

}


public String getResults(Bitmap bitmap)
{
    mTess.setImage(bitmap);
    String result = mTess.getUTF8Text();
    return result;
}

public void onDestroy() {
    if (mTess != null)
        mTess.end();
}
}

此代码检查您的电话中是否存在带有目录/AndroidOCR/tessdata/eng.traineddata的文件,如果没有,则创建一个并放置.RealDeDATA文件。
要做到这一点,您必须在oncreate中创建AssetManager,这将允许您访问您在项目中计算机中放置的.traineddata文件。
所以在你的oncreate in main活动中:
AssetManager assetManager = getAssets();
TessOCR tess = new TessOCR(assetManager);

此外,要允许android项目在AndroidManifest.xml文件中将数据写入手机,您需要添加权限行:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这是我个人使用的方法,没有任何错误。如果你有答案,在谷歌搜索答案,如果你仍然找不到答案,在评论中发表。

10-02 23:55