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

Google MLKit文字识别addOnSuccessListener与addOnFailureListener均不触发问题

问题根因

你遇到的回调不触发问题是两个核心错误导致的:

  • 你在异步识别任务还未执行完成时,就提前关闭了TextRecognizer实例:recognizer.process(image)是异步执行逻辑,你给Task绑定完回调后立刻执行了recognizer.close(),直接销毁了识别器实例,未完成的识别任务会被直接终止,自然不会触发任何成功或失败回调。
  • 逻辑顺序错误:你尝试同步返回异步任务的结果,recognizeTextFromImage执行返回时OCR识别还在运行中,你拿到的recognizedText永远是空值,就算后续识别完成也不会更新UI。
修复方案

1. 调整识别逻辑,将UI更新移到回调内

修改recognizeTextFromImage方法,移除提前关闭识别器的代码,在回调内处理结果更新UI:

private void recognizeTextFromImage(InputImage image) {
    TextRecognizer recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS);
    Task<Text> task = recognizer.process(image);
    task
            .addOnSuccessListener(
                    new OnSuccessListener<Text>() {
                        @Override
                        public void onSuccess(Text texts) {
                            Log.d(TAG,"Successful");
                            String recognizedText = processTextRecognitionResult(texts);
                            // 直接在回调内更新UI
                            if (recognizedText.isEmpty()) {
                                Toast.makeText(getApplicationContext(), "未识别到有效内容,请重试",Toast.LENGTH_LONG).show();
                                editText_Site.setText("识别失败!");
                            } else {
                                editText_Site.setText(recognizedText);
                            }
                            // 任务完成后再关闭识别器
                            recognizer.close();
                        }
                    })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            e.printStackTrace();
                            Log.d(TAG,"Not Successful");
                            Toast.makeText(getApplicationContext(), "识别失败:"+e.getMessage(),Toast.LENGTH_LONG).show();
                            editText_Site.setText("识别失败!");
                            // 任务失败也关闭识别器
                            recognizer.close();
                        }
                    });
}

2. 修改onActivityResult调用逻辑

移除同步等待返回结果的代码,直接调用识别方法即可:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult( requestCode, resultCode, data);
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        // 先判空,避免文件读取失败导致空指针
        Bitmap bitmap=BitmapFactory.decodeFile(currentPhotoPath);
        if (bitmap == null) {
            Toast.makeText(getApplicationContext(), "图片读取失败", Toast.LENGTH_LONG).show();
            return;
        }
        InputImage inputImage = InputImage.fromBitmap(bitmap, 0);
        // 直接调用识别方法,结果在回调内更新
        recognizeTextFromImage(inputImage);
    } else {
        Toast.makeText(getApplicationContext(), "拍照出现问题,请联系应用开发者",Toast.LENGTH_LONG).show();
    }
}

3. 额外修复高版本resultCode为0的问题

高版本安卓返回resultCode为0是因为你没有动态申请权限,API23及以上除了Manifest声明权限,还需要在运行时主动申请相机、存储权限,用户授权后才能正常调用相机拍照。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:06:04