最近做一个OCR识别VIN的项目,其中用到了将字库复制到SD卡中的功能,在此记录下,下次要用方便,不用再那么难找。废话不多说,上代码是个工具类,要用直接调用,传几个参数就可以了。
/**
* 将assets中的识别库复制到SD卡中
*/
public class SDUtils {
private static final String TAG = "SDUtils";
/**
* 将assets中的识别库复制到SD卡中
*
* @param path 要存放在SD卡中的 完整的文件名。这里是"/storage/emulated/0//tessdata/chi_sim.traineddata"
* @param name assets中的文件名 这里是 "chi_sim.traineddata"
*/
public static void assets2SD(Context context, String path, String name) {
Log.e(TAG, "assets2SD: " + path);
Log.e(TAG, "assets2SD: " + name);
//如果存在就删掉
File f = new File(path);
if (f.exists()) {
f.delete();
}
if (!f.exists()) {
File p = new File(f.getParent());
if (!p.exists()) {
p.mkdirs();
}
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
InputStream is = null;
OutputStream os = null;
try {
is = context.getAssets().open(name);
File file = new File(path);
os = new FileOutputStream(file);
byte[] bytes = new byte[2048];
int len = 0;
while ((len = is.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null)
is.close();
if (os != null)
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
使用方法,在初始化的地方直接调用传参即可。
/** * TessBaseAPI初始化用到的第一个参数,是个目录。 */ private static final String DATAPATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator; /** * 在DATAPATH中新建这个目录,TessBaseAPI初始化要求必须有这个目录。 */ private static final String tessdata = DATAPATH + File.separator + "tessdata"; /** * TessBaseAPI初始化测第二个参数,就是识别库的名字不要后缀名。 */ private static String DEFAULT_LANGUAGE = "chi_sim"; /** * assets中的文件名 */ private static String DEFAULT_LANGUAGE_NAME = DEFAULT_LANGUAGE + ".traineddata"; /** * 保存到SD卡中的完整文件名 */ private static String LANGUAGE_PATH = tessdata + File.separator + DEFAULT_LANGUAGE_NAME;//Android6.0之前安装时就能复制,6.0之后要先请求权限,所以6.0以上的这个方法无用。assets2SD(getApplicationContext(), LANGUAGE_PATH, DEFAULT_LANGUAGE_NAME);