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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:54:06