java
public static void recognizeChineseTextInk(Ink ink, OcrCallback ocrCallback) {
// 指定语言的识别模型
DigitalInkRecognitionModelIdentifier modelIdentifier;
try {
modelIdentifier = DigitalInkRecognitionModelIdentifier.fromLanguageTag("zh-Hani-CN");
} catch (MlKitException e) {
ocrCallback.onError(e);
return;
}
if (modelIdentifier == null) {
ocrCallback.onError(new Exception("no model was found"));
return;
}
DigitalInkRecognitionModel model = DigitalInkRecognitionModel.builder(modelIdentifier).build();
// 获取 DigitalInkRecognizer 的实例
DigitalInkRecognizer recognizer = DigitalInkRecognition.getClient(
DigitalInkRecognizerOptions.builder(model).build()
);
// 处理 Ink 对象
recognizer.recognize(ink)
.addOnSuccessListener(recognitionResult -> {
if (ocrCallback != null)
ocrCallback.onSuccess(recognitionResult.getCandidates().get(0).getText());
})
.addOnFailureListener(e -> {
if (ocrCallback != null) ocrCallback.onError(e);
});
}
-
在 Android 开发中,调用上述 ML Kit 数字墨水识别代码,出现如下错误信息
com.google.mlkit.common.MlKitException: An internal error occurred during initialization.
解读
初始化过程中发生内部错误
问题原因
- 通常情况下是模型未下载,识别前需确保模型文件已成功下载,未下载模型会导致初始化失败
处理策略
- 检查模型状态,如果没有下载,则下载模型,然后在调用识别
java
public static void getModel(String languageTag, OcrGetModelCallback ocrGetModelCallback) {
// 指定语言的识别模型
DigitalInkRecognitionModelIdentifier modelIdentifier;
try {
modelIdentifier = DigitalInkRecognitionModelIdentifier.fromLanguageTag(languageTag);
} catch (MlKitException e) {
ocrGetModelCallback.onError(e);
return;
}
if (modelIdentifier == null) {
ocrGetModelCallback.onError(new Exception("no model was found"));
return;
}
DigitalInkRecognitionModel model = DigitalInkRecognitionModel.builder(modelIdentifier).build();
RemoteModelManager remoteModelManager = RemoteModelManager.getInstance();
// 检查模型是否已下载
remoteModelManager.isModelDownloaded(model)
.addOnSuccessListener(aBoolean -> {
Log.i(TAG, "modelDownloaded: " + aBoolean);
if (aBoolean) {
if (ocrGetModelCallback != null) ocrGetModelCallback.onSuccess(model);
} else {
// 下载模型
remoteModelManager.download(model, new DownloadConditions.Builder().build())
.addOnSuccessListener(aVoid -> {
Log.i(TAG, "model downloaded");
if (ocrGetModelCallback != null)
ocrGetModelCallback.onSuccess(model);
})
.addOnFailureListener(e -> {
if (ocrGetModelCallback != null) ocrGetModelCallback.onError(e);
});
}
})
.addOnFailureListener(e -> {
if (ocrGetModelCallback != null) ocrGetModelCallback.onError(e);
});
}
java
public static void recognizeChineseTextInk(Ink ink, OcrCallback ocrCallback) {
getModel("zh-Hani-CN", new OcrGetModelCallback() {
@Override
public void onSuccess(DigitalInkRecognitionModel model) {
// 获取 TextRecognizer 实例
DigitalInkRecognizer recognizer = DigitalInkRecognition.getClient(
DigitalInkRecognizerOptions.builder(model).build()
);
// 处理 Ink 对象
recognizer.recognize(ink)
.addOnSuccessListener(recognitionResult -> {
if (ocrCallback != null)
ocrCallback.onSuccess(recognitionResult.getCandidates().get(0).getText());
})
.addOnFailureListener(e -> {
if (ocrCallback != null) ocrCallback.onError(e);
});
}
@Override
public void onError(Exception e) {
if (ocrCallback != null) ocrCallback.onError(e);
}
});
}