如何使用 Firebase ML Kit 创建用于条形码扫描的模块化 class

How to create a modular class for barcode scanning using Firebase ML Kit

我想创建一个模块 class,我可以随时使用它来扫描条形码。这可能使用 Firebase ML Kit 吗?

这是我目前得到的:

public List<FirebaseVisionBarcode> ScanBarcode(int... barcodeFormats)
{
    //region Init, config and execution of the barcode scanning
    final FirebaseVisionBarcodeDetectorOptions.Builder BUILDER =
            new FirebaseVisionBarcodeDetectorOptions.Builder();

    //Set barcode formats based on arguments
    for (int formats : barcodeFormats)
    {
        BUILDER.setBarcodeFormats(formats);
    }

    final FirebaseVisionBarcodeDetectorOptions OPTIONS = BUILDER.build();

    final FirebaseVisionImage IMAGE = FirebaseVisionImage.fromBitmap(bitmap);

    final FirebaseVisionBarcodeDetector DETECTOR = FirebaseVision.getInstance()
            .getVisionBarcodeDetector(OPTIONS);

    DETECTOR.detectInImage(IMAGE)
            .addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>()
            {
                @Override
                public void onSuccess(List<FirebaseVisionBarcode> _barcodes)
                {
                    barcodes = _barcodes;
                }
            })

            .addOnFailureListener(new OnFailureListener()
            {
                @Override
                public void onFailure(@NonNull Exception e)
                {
                    barcodes = new ArrayList<>();
                }
            });

    //endregion

    return barcodes;

主要取自https://firebase.google.com/docs/ml-kit/

这里的问题是 DETECTOR 的侦听器是某种异步调用。这意味着它将在 onSuccess 被调用之前 return。

条形码扫描部分可以使用,但我很难将其包装在自己的 class 中。

谢谢。

我明白了。不确定这是否是最好的方法 class 结构明智,但它工作得很好。

public Task<List<FirebaseVisionBarcode>> ScanBarcode(int... barcodeFormats)
{
    //region Init, config and execution of the barcode scanning. Mostly taken from https://firebase.google.com/docs/ml-kit/
    final FirebaseVisionBarcodeDetectorOptions.Builder BUILDER =
            new FirebaseVisionBarcodeDetectorOptions.Builder();

    //Set barcode formats based on arguments
    for (int formats : barcodeFormats)
    {
        BUILDER.setBarcodeFormats(formats);
    }

    final FirebaseVisionBarcodeDetectorOptions OPTIONS = BUILDER.build();

    final FirebaseVisionImage IMAGE = FirebaseVisionImage.fromBitmap(bitmap);

    final FirebaseVisionBarcodeDetector DETECTOR = FirebaseVision.getInstance()
            .getVisionBarcodeDetector(OPTIONS);

    final Task<List<FirebaseVisionBarcode>> DETECT_IMG_TASK = DETECTOR.detectInImage(IMAGE)
            .addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>()
            {
                @Override
                public void onSuccess(List<FirebaseVisionBarcode> _barcodes)
                {
                    barcodes = _barcodes;
                }
            })

            .addOnFailureListener(new OnFailureListener()
            {
                @Override
                public void onFailure(@NonNull Exception e)
                {
                    barcodes = new ArrayList<>();
                }
            });

    return DETECT_IMG_TASK;
    //endregion

}

public List<FirebaseVisionBarcode> GetBarcodes()
{
    return barcodes;
}

detectInImagereturn一个Task。我做的就是return这个任务。此任务完成后,您可以调用 GetBarcodes 来获取解析后的数据。我讨厌强制调用其他方法来获得最终结果,但这是我让它工作的唯一方法。