ML Kit结合CameraX开发条码扫描器偶现识别错误问题求助
问题修复方案
1. 统一ImageAnalysis和Preview的宽高比
你当前Preview明确设置了AspectRatio.RATIO_4_3,但ImageAnalysis的宽高比配置被注释,默认会使用16:9的比例,二者不一致会导致传入ML Kit的图像出现拉伸/裁切变形,条码识别就会出现乱码、截断问题。
修改bindPreview方法中ImageAnalysis的初始化代码:
imageAnalysis = new ImageAnalysis.Builder() .setTargetAspectRatio(AspectRatio.RATIO_4_3) // 和Preview保持一致的宽高比 .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build();
2. 升级CameraX到稳定版
你当前使用的1.1.0-alpha08是非常早期的测试版本,存在大量已知的图像输出、旋转角度处理的bug,是识别错误的核心诱因之一。建议升级到最新的稳定版,修改build.gradle(app)中的camerax依赖版本:
def camerax_version = "1.3.1" implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" implementation "androidx.camera:camera-view:${camerax_version}" implementation "androidx.camera:camera-extensions:${camerax_version}"
3. 修正图像资源关闭逻辑
你当前在OnCompleteListener中同时关闭mediaImage和imageProxy,属于重复释放资源,会导致后续帧处理异常,且如果scanner.process抛出异常会存在资源泄露风险。建议调整关闭逻辑:
@Override public void analyze(@NonNull ImageProxy imageProxy) { @SuppressLint({"UnsafeExperimentalUsageError", "UnsafeOptInUsageError"}) Image mediaImage = imageProxy.getImage(); if (mediaImage == null) { imageProxy.close(); return; } InputImage image = InputImage.fromMediaImage(mediaImage, imageProxy.getImageInfo().getRotationDegrees()); Task<List<Barcode>> result = scanner.process(image); result.addOnSuccessListener(barcodes -> processBarcode(barcodes)) .addOnFailureListener(e -> Toast.makeText(getApplicationContext(), "识别失败", Toast.LENGTH_SHORT).show()) .addOnCompleteListener(task -> { imageProxy.close(); // ImageProxy关闭时会自动释放内部包装的mediaImage,无需重复关闭 }); }
4. 优化条码识别参数
可以给条码扫描器开启针对Code128的高精度识别模式,提升识别准确率:
BarcodeScannerOptions barcodeScannerOptions = new BarcodeScannerOptions.Builder() .setBarcodeFormats(Barcode.FORMAT_CODE_128) .enableAllPotentialBarcodes() // 开启潜在条码识别,提升低清晰度条码的识别率 .build();
修改完以上内容后清理项目重新编译运行,即可解决条码识别截断、带乱码的问题。
内容的提问来源于stack exchange,提问作者Kaden
相关产品推荐
相关产品推荐

