Android 开发问题:MlKitException: An internal error occurred during initialization.

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);
        }
    });
}
相关推荐
_Evan_Yao5 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd6 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼6 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122667 小时前
TCP 1
java·1024程序员节
美狐美颜SDK开放平台7 小时前
准备开发直播APP?视频美颜SDK接入前的十项检查清单
android·ios·音视频·直播美颜sdk·视频美颜sdk
传奇开心果编程7 小时前
【Jetpack Compose娓娓道来】第26课:Repository模式与数据层设计——数据的唯一入口
android·移动开发·1024程序员节·jetpack compose·编程语言理论·编程框架·声明式ui
金銀銅鐵9 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手9 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck11 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_322414280411 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis