在我的 .NET Maui 8.0 移动应用程序中,我需要能够扫描条形码。我正在使用 NuGet 包ZXing.Net.Maui。我根据他们的 Git 页面设置了一切。
我的设置
我添加了 NuGet 包
ZXing.Net.MAUI
和 ZXing.Net.MAUI.Controls
,将 .UseBarcodeReader()
添加到了 CreateMauiApp
中的构建器,并在 XAML 中使用该控件,如下所示:
<Frame Grid.Row="3"
Padding="0">
<zxing:CameraBarcodeReaderView x:Name="cameraBarcodeReaderView"
BarcodesDetected="BarcodesDetected" />
</Frame>
对 zxing 的 XAML 引用定义为
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls"
在页面的代码隐藏类中,我在调用
InitializeComponent()
之后立即使用以下代码来设置构造函数中的选项。
cameraBarcodeReaderView.Options = new BarcodeReaderOptions
{
Formats = BarcodeFormats.All,
AutoRotate = true,
Multiple = true,
TryHarder = true,
TryInverted = true
};
同一类中的以下函数处理检测到的条形码。
private void BarcodesDetected(object sender, BarcodeDetectionEventArgs e)
{
_logService?.LogInfo($"{this}.BarcodesDetected > {nameof(sender)} = {sender}, {nameof(e)} = [{e}]");
foreach (var barcode in e.Results)
{
_logService?.LogInfo($"{this}.BarcodesDetected > {nameof(sender)} = {sender}, {nameof(e)} = [{e}] > Barcode: {barcode.Format} -> {barcode.Value}");
_viewModel.ProcessScan(new ScanResult(ScanSource.BarcodeScan, barcode.Value, barcode.Raw));
}
}
视图模型然后处理扫描。
我的问题
我们需要为应用程序的不同模块支持不同类型的条形码。对于使用像
Code 128
这样的一维条形码的模块来说,效果非常好!没有抱怨,一切正常!
但是,我无法扫描任何 FedEx 运输标签条形码。这些是二维条形码,根据网站的说法,它们是
PDF417
条形码。我没有收到他们的任何活动。如果我将手机进一步向下移动到运输标签上一维条形码的位置,它就会被正确检测到。然而,对我们来说很重要的二维二维却没有被检测到。
我尝试过的
我尝试在不同位置(例如页面的构造函数)或 Loaded 事件中设置条形码扫描仪视图的选项,但它永远不会触发二维条形码。我还尝试将格式设置更改为
BarcodeFormats.TwoDimensional
或 BarcodeFormat.Pdf417
,但我没有运气。
我认为这只是一个设置错误,但我错过了什么?
看起来您已正确设置所有内容,但 PDF417 条形码是 ZXing 的一个已知挑战。与 Code 128 等简单格式不同,ZXing 由于密度和尺寸的原因,常常难以处理 PDF417 等复杂的二维条码。
您可以尝试设置格式:直接使用
BarcodeFormats.Pdf417
而不是BarcodeFormats.All
。另外,PDF417条码通常需要清晰的焦点和良好的照明,因此您可以尝试在不同的环境下扫描。
您可能会考虑商业替代方案,例如 Scanbot SDK(免责声明:我为他们工作)。它专为 PDF417 等复杂条形码而构建,并由企业物流应用程序使用。