Как создать модульный класс для сканирования штрих-кода с помощью Firebase ML Kit - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу создать модульный класс, который я могу использовать в любое время, когда хочу сканировать штрих-код.Возможно ли это с помощью 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 голосов
/ 11 апреля 2019

Я понял это.Не уверен, что это лучший подход к структуре классов, но он работает довольно хорошо.

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, чтобы получить проанализированные данные.Я ненавижу заставлять вызывать дополнительные методы, чтобы получить окончательные результаты, но это был единственный способ заставить его работать.

...