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
相关产品推荐
相关产品推荐

