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

时间:2019-04-10 21:46:22

标签: java android firebase barcode-scanner

我想创建一个模块化类,可以在我想扫描条形码的任何时候使用。使用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之前返回。

条形码扫描部分可以工作,但是我很难将其包装在自己的类中。

谢谢。

1 个答案:

答案 0 :(得分:0)

我知道了。不确定这是否是最好的方法类结构,但是效果很好。

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;
}

detectInImage返回一个Task。我所做的就是返回此任务。该任务完成后,您可以调用GetBarcodes来获取解析后的数据。我讨厌强迫调用其他方法来获得最终结果,但这是我可以使它起作用的唯一方法。