如何使用 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;
}
detectInImage
return一个Task
。我做的就是return这个任务。此任务完成后,您可以调用 GetBarcodes
来获取解析后的数据。我讨厌强制调用其他方法来获得最终结果,但这是我让它工作的唯一方法。
我想创建一个模块 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;
}
detectInImage
return一个Task
。我做的就是return这个任务。此任务完成后,您可以调用 GetBarcodes
来获取解析后的数据。我讨厌强制调用其他方法来获得最终结果,但这是我让它工作的唯一方法。