基于ML Kit与Android Studio的文字识别无结果问题求助
你遇到的这个问题我之前也碰到过几次,结合你的代码和常见坑点,给你梳理几个关键排查方向:
异步任务被提前终止
看你的代码,在添加完识别任务的回调后立刻调用了text_recognizer.close(),但ML Kit的process方法是异步执行的——这会导致识别任务还没跑完就被销毁,直接触发失败回调。
正确的做法是把关闭操作移到回调内部,确保任务完成后再释放资源:task.addOnCompleteListener(new OnCompleteListener<Text>() { @Override public void onComplete(@NonNull Task<Text> task_) { try { if (task_.isSuccessful()) { Text result = task_.getResult(); text_view.setText("Text Detected: " + result.getText()); } else { Exception e = task_.getException(); text_view.setText("Text Detection Failed: " + e.getMessage()); e.printStackTrace(); // 打印具体错误信息,方便定位 } } finally { text_recognizer.close(); // 任务完成后再关闭 } } });使用了低分辨率缩略图
你通过data.getExtras().get("data")获取的Bitmap是系统返回的缩略图,尺寸通常只有几百像素,文字细节丢失严重,ML Kit根本无法识别。应该改为获取拍照后的高清原图:
比如提前指定相机的图片保存路径,再在onActivityResult中读取原图:// 启动相机时的代码(提前准备好图片存储路径) private File photoFile; private static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { try { photoFile = createImageFile(); // 自定义方法创建临时图片文件 } catch (IOException ex) { // 处理文件创建失败的情况 } if (photoFile != null) { Uri photoURI = FileProvider.getUriForFile(this, "com.yourapp.package.fileprovider", photoFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } } // 在onActivityResult中读取原图 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { // 加载高清原图 Bitmap image_bitmap = BitmapFactory.decodeFile(photoFile.getAbsolutePath()); image_view.setImageBitmap(image_bitmap); // 后续识别代码... } } // 辅助方法:创建临时图片文件 private File createImageFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); return File.createTempFile( imageFileName, /* 前缀 */ ".jpg", /* 后缀 */ storageDir /* 存储目录 */ ); }图像旋转角度错误
ML Kit需要知道图片的正确旋转角度才能准确识别文字,你现在传的0可能不符合实际情况——比如竖屏拍照时,图片会被旋转90度,ML Kit识别时相当于看倒着的文字,自然失败。
可以通过ExifInterface获取图片的真实旋转角度:private int getImageRotation(File imageFile) throws IOException { ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: return 90; case ExifInterface.ORIENTATION_ROTATE_180: return 180; case ExifInterface.ORIENTATION_ROTATE_270: return 270; default: return 0; } } // 创建InputImage时传入正确角度 int rotationAngle = getImageRotation(photoFile); InputImage input_image = InputImage.fromBitmap(image_bitmap, rotationAngle);未查看具体错误原因
你现在只显示“Text Detection Failed”,但没有打印具体异常信息——比如是权限不足?ML Kit初始化失败?还是图像格式不支持?建议在失败回调中打印完整错误栈,这是快速定位问题的关键:} else { Exception e = task_.getException(); if (e != null) { text_view.setText("Text Detection Failed: " + e.getMessage()); Log.e("TextRecogError", "识别失败详情", e); // 在Logcat中查看完整错误 } }检查依赖与权限配置
确认你的app级build.gradle已经正确添加ML Kit依赖:dependencies { // 本地文字识别模型(无需联网) implementation 'com.google.mlkit:text-recognition:16.0.0' // 如果用云端模型,替换为下面的依赖 // implementation 'com.google.mlkit:text-recognition-cloud:16.0.0' }同时确认
AndroidManifest.xml中已申请必要权限,且Android 6.0+设备上已动态申请相机权限:<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" />
内容的提问来源于stack exchange,提问作者user13860384

