使用条形码扫描仪标志

本主题介绍了如何使用通用 Windows 平台 (UWP) 条形码扫描仪 API 在无需手动配置扫描仪的情况下处理条形码标志。

条形码标志是将数据映射到特定条形码格式。 一些常见标志包括 UPC、代码 128、QR 码等。

确定支持哪些标志

由于应用程序可以与来自多个制造商的不同条形码扫描仪模型一起使用,因此可能需要查询扫描程序以确定它支持的标志列表。 如果应用需要特定的标志,但并非所有扫描仪都支持该标志,或者需要启用在扫描程序上手动或以编程方式禁用的标志,则此功能非常有用。

使用 BarcodeScanner.FromIdAsync 获取 BarcodeScanner 对象后,请调用 GetSupportedSymbologiesAsync 以获取设备支持的标志列表。

以下示例将获取条形码扫描仪支持的标志列表,并将其显示在文本块中:

private void DisplaySupportedSymbologies(BarcodeScanner barcodeScanner, TextBlock textBlock) 
{
    var supportedSymbologies = await barcodeScanner.GetSupportedSymbologiesAsync();

    foreach (uint item in supportedSymbologies)
    {
        string symbology = BarcodeSymbologies.GetName(item);
        textBlock.Text += (symbology + "\n");
    }
}

确定是否支持特定标志

若要确定扫描仪是否支持某个特定标志,可以调用 IsSymbologySupportedAsync

以下示例将检查条形码扫描仪是否支持 Code32 标志:

bool symbologySupported = await barcodeScanner.IsSymbologySupportedAsync(BarcodeSymbologies.Code32);

更改识别的标志

在某些情况下,你可能想要使用条形码扫描仪支持的标志的子集。 这特别适用于阻止你不打算在应用程序中使用的标志。 例如,若要确保用户扫描正确的条形码,可以在获取项目 SKU 时将扫描限制为 UPC 或 EAN,并在获取序列号时将扫描限制为 Code 128。

知道扫描仪支持的标志后,可以设置要识别的标志。 这可以在使用 ClaimScannerAsync 建立 ClaimedBarcodeScanner 对象后执行。 可以调用 SetActiveSymbologiesAsync 来启用一组特定的标志,同时禁用从列表中省略的标志。

以下示例将声明的条形码扫描仪的活动标志设置为 Code39Code39Ex

private async void SetSymbologies(ClaimedBarcodeScanner claimedBarcodeScanner) 
{
    var symbologies = new List<uint>{ BarcodeSymbologies.Code39, BarcodeSymbologies.Code39Ex };
    await claimedBarcodeScanner.SetActiveSymbologiesAsync(symbologies);
}

条形码标志属性

不同的条形码标志可以具有不同的属性,例如支持多种解码长度,将校验位作为原始数据的一部分传输到主机以及校验位验证。 使用 BarcodeSymbologyAttributes 类,可以获取和设置给定 ClaimedBarcodeScanner 和条形码标志的这些属性。

可以使用 GetSymbologyAttributesAsync 获取给定标志的属性。 以下代码片段将获取 ClaimedBarcodeScanner 的 Upca 标志的属性。

BarcodeSymbologyAttributes barcodeSymbologyAttributes = 
    await claimedBarcodeScanner.GetSymbologyAttributesAsync(BarcodeSymbologies.Upca);

修改完属性并准备好设置它们时,可以调用 SetSymbologyAttributesAsync。 此方法将返回一个布尔值,如果属性设置成功,则为 true

bool success = await claimedBarcodeScanner.SetSymbologyAttributesAsync(
    BarcodeSymbologies.Upca, barcodeSymbologyAttributes);

按数据长度限制扫描数据

某些标志是可变长度,如 Code 39 或 Code 128。 这些标志的条形码可以放到包含不同数据(通常具有特定长度)的其他各标志附近。 设置所需数据的特定长度可会阻止无效扫描。

设置解码长度之前,请使用 IsDecodeLengthSupported 检查条形码标志是否支持多种长度。 如果支持,可以设置 DecodeLengthKind,其类型为 BarcodeSymbologyDecodeLengthKind。 此属性可以是下列任一值:

  • AnyLength:解码任意数字的长度。
  • 离散:解码 DecodeLength1DecodeLength2 单字节字符的长度。
  • 范围:解码 DecodeLength1DecodeLength2 单字节字符之间的长度。 DecodeLength1 和 DecodeLength2 的顺序无关紧要(其中一个可以比另一个大或小)。

最后,可以设置 DecodeLength1 和 DecodeLength2 的值,以控制所需数据的长度。

以下代码片段演示如何设置解码长度:

private async Task<bool> SetDecodeLength(
    ClaimedBarcodeScanner scanner,
    uint symbology, 
    BarcodeSymbologyDecodeLengthKind kind, 
    uint decodeLength1, 
    uint decodeLength2)
{
    bool success = false;
    BarcodeSymbologyAttributes attributes = await scanner.GetSymbologyAttributesAsync(symbology);

    if (attributes.IsDecodeLengthSupported)
    {
        attributes.DecodeLengthKind = kind;
        attributes.DecodeLength1 = decodeLength1;
        attributes.DecodeLength2 = decodeLength2;
        success = await scanner.SetSymbologyAttributesAsync(symbology, attributes);
    }

    return success;
}

校验位传输

另一个可以设置的标志属性即为是否将校验位作为原始数据的一部分传输到主机。 在进行此设置之前,请使用 IsCheckDigitTransmissionSupported 确保标志支持校验位传输。 然后,使用 IsCheckDigitTransmissionEnabled 设置是否启用校验位传输。

以下代码片段演示如何设置校验位传输:

private async Task<bool> SetCheckDigitTransmission(ClaimedBarcodeScanner scanner, uint symbology, bool isEnabled)
{
    bool success = false;
    BarcodeSymbologyAttributes attributes = await scanner.GetSymbologyAttributesAsync(symbology);

    if (attributes.IsCheckDigitTransmissionSupported)
    {
        attributes.IsCheckDigitTransmissionEnabled = isEnabled;
        success = await scanner.SetSymbologyAttributesAsync(symbology, attributes);
    }

    return success;
}

校验位验证

还可以设置是否验证条形码校验位。 在进行此设置之前,请使用 IsCheckDigitValidationSupported 确保标志支持校验位验证。 然后,使用 IsCheckDigitValidationEnabled 设置是否启用校验位验证。

以下代码片段演示如何设置校验位验证:

private async Task<bool> SetCheckDigitValidation(ClaimedBarcodeScanner scanner, uint symbology, bool isEnabled)
{
    bool success = false;
    BarcodeSymbologyAttributes attributes = await scanner.GetSymbologyAttributesAsync(symbology);

    if (attributes.IsCheckDigitValidationSupported)
    {
        attributes.IsCheckDigitValidationEnabled = isEnabled;
        success = await scanner.SetSymbologyAttributesAsync(symbology, attributes);
    }

    return success;
}

支持和反馈

查找问题的答案

有问题? 请在文档问答论坛上使用 UWP 标记或在 Stack Overflow 上使用 pointofservice 标记向我们提问。

帮助我们找到你的问题:

  • 在 Stack Overflow 上,将 pointofservice 标记添加到你的问题中。
  • 在问答论坛上,将“UWP”一词添加到你的帖子中

另请参阅