条形码和二维码扫描不适用于 CameraX / ZXing

Barcode & Qr code scanning not working with CameraX / ZXing

我想在我的应用程序中实现二维码+条码扫描功能,但我只能扫描二维码。

我使用 ZXing 作为扫描库,使用 CameraX 作为相机功能。为了分析 CameraX 捕获的图像,我使用自定义 ImageAnalysis.Analyzer class 来检测和解码 QR 码 + 条形码(不起作用)。

这是我的分析仪:

class MyCodeImageAnalyzer(
    private val onCodeDetected: (code: Result) -> Unit
) : ImageAnalysis.Analyzer {

    private val yuvFormats = mutableListOf(YUV_420_888)

    init {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            yuvFormats.addAll(listOf(YUV_422_888, YUV_444_888))
        }
    }

    private val reader = MultiFormatReader()

    override fun analyze(image: ImageProxy) {
        // We are using YUV format because, ImageProxy internally uses ImageReader to get the image
        // by default ImageReader uses YUV format unless changed.

        if (image.format !in yuvFormats) {
            Timber.e("QRCodeAnalyzer Expected YUV, now = ${image.format}")
            return
        }

        val data = image.planes[0].buffer.toByteArray()

        val source = PlanarYUVLuminanceSource(
            data,
            image.width,
            image.height,
            0,
            0,
            image.width,
            image.height,
            false
        )

        val binaryBitmap = BinaryBitmap(HybridBinarizer(source))
        try {
            // Whenever reader fails to detect a QR code in image
            // it throws NotFoundException
            val result = reader.decode(binaryBitmap)
            onCodeDetected(result)
        } catch (e: NotFoundException) {
            e.printStackTrace()
        }
        image.close()
    }
}

我使用 MultiFormatReader,它考虑了多种格式,包括二维码和条形码。 我认为问题出在 yuvFormats 列表中,但我不知道要添加什么。

您可以使用 Google 机器学习套件扫描 QR/Barcodes。

请看我的文章here。在哪里可以看到如何使用 Google ML Kit 和 Jetpack CameraX 创建条码扫描仪。

这是最新的处理方式,而且太简单了。