Compartir a través de


Trabajar con simbologías del escáner de códigos de barras

En este tema se explica cómo usar las API del escáner de códigos de barras de la Plataforma universal de Windows (UWP) para procesar simbologías de código de barras sin configurar manualmente el escáner.

Una simbología de código de barras es la asignación de datos a un formato de código de barras específico. Algunas simbologías comunes incluyen UPC, Code 128, QR Code, etc.

Determinar qué simbologías se admiten

Dado que la aplicación puede usarse con diferentes modelos de escáner de códigos de barras de varios fabricantes, puede que desee consultar el escáner para determinar la lista de simbologías que admite. Esto puede ser útil si la aplicación requiere una simbología específica que puede no ser compatible con todos los escáneres o necesita habilitar simbologías que se han deshabilitado manualmente o mediante programación en el escáner.

Una vez que tenga un objeto BarcodeScanner utilizando BarcodeScanner.FromIdAsync, llame a GetSupportedSymbologiesAsync para obtener una lista de las simbologías que el dispositivo admite.

En el ejemplo siguiente se obtiene una lista de las simbologías admitidas del escáner de códigos de barras y se muestran en un bloque de texto:

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

Determinar si se admite una simbología específica

Para determinar si el escáner admite una simbología específica, puede llamar a IsSymbologySupportedAsync.

En el siguiente ejemplo se comprueba si el escáner de códigos de barras admite la simbología Code32.

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

Cambio de las simbologías que se reconocen

En algunos casos, es posible que desee usar un subconjunto de simbologías que admite el escáner de códigos de barras. Esto resulta especialmente útil para bloquear simbologías que no se van a usar en la aplicación. Por ejemplo, para asegurarse de que un usuario escanea el código de barras correcto, puede restringir el escaneo a UPC o EAN al adquirir los SKU de los artículos y restringir el escaneo a Code 128 al adquirir números de serie.

Una vez que conozca las simbologías que admite el escáner, puede establecer las simbologías que desea que reconozca. Esto se puede hacer después de haber establecido un objeto ClaimedBarcodeScanner mediante ClaimScannerAsync. Puede llamar a SetActiveSymbologiesAsync para habilitar un conjunto específico de simbologías, mientras que las que no se incluyan en su lista serán deshabilitadas.

En el ejemplo siguiente se establecen las simbologías activas de un escáner de códigos de barras reclamado en Code39 y Code39Ex:

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

Atributos de simbología de código de barras

Diferentes simbologías de código de barras pueden tener atributos diferentes, como admitir varias longitudes de descodificación, transmitir el dígito de comprobación al host como parte de los datos sin procesar y comprobar la validación de dígitos. Con la clase BarcodeSymbologyAttributes, puedes obtener y establecer estos atributos para un ClaimedBarcodeScanner y simbología de código de barras.

Puede obtener los atributos de una simbología determinada con GetSymbologyAttributesAsync. El siguiente fragmento de código obtiene los atributos de la simbología Upca de un ClaimedBarcodeScanner.

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

Cuando haya terminado de modificar los atributos y esté listo para establecerlos, puede llamar a SetSymbologyAttributesAsync. Este método devuelve una bool, que es true si los atributos se establecieron correctamente.

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

Restringir los datos del análisis según la longitud de los datos

Algunas simbologías son longitud variable, como código 39 o código 128. Los códigos de barras de estas simbologías se pueden encontrar cerca unos de otros, conteniendo datos diferentes a menudo de una longitud específica. Establecer la longitud específica de los datos que necesita puede evitar escaneos inválidos.

Antes de establecer la longitud de descodificación, compruebe si la simbología de código de barras admite varias longitudes con IsDecodeLengthSupported. Una vez que sepa que se admite, puede establecer DecodeLengthKind, que es de tipo BarcodeSymbologyDecodeLengthKind. Esta propiedad puede ser cualquiera de los siguientes valores:

  • AnyLength: descodifica las longitudes de cualquier número.
  • discreto: descodifica las longitudes de DecodeLength1 o DecodeLength2 caracteres de un solo byte.
  • Rango: decodifica las longitudes entre DecodeLength1 y DecodeLength2 caracteres de un solo byte. El orden de DecodeLength1 y DecodeLength2 no importa (puede ser mayor o inferior que el otro).

Por último, puede establecer los valores de DecodeLength1 y DecodeLength2 para controlar la longitud de los datos que necesita.

El siguiente fragmento de código muestra cómo establecer la longitud de descodificación:

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

Comprobación de la transmisión de dígitos

Otro atributo que puede establecer en una simbología es si el dígito de comprobación se transmitirá al host como parte de los datos sin procesar. Antes de establecer esto, asegúrese de que la simbología admite la transmisión de dígitos de comprobación con IsCheckDigitTransmissionSupported. A continuación, establezca si la transmisión de dígitos de comprobación está habilitada con IsCheckDigitTransmissionEnabled.

En el fragmento de código siguiente se muestra cómo establecer la transmisión de dígitos de comprobación:

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

Comprobación de la validación de dígitos

También puede establecer si se validará el dígito de comprobación de código de barras. Antes de configurarlo, asegúrese de que la simbología admite la validación de dígitos de comprobación con IsCheckDigitValidationSupported. A continuación, establezca si la validación de dígitos de comprobación está habilitada con IsCheckDigitValidationEnabled.

En el fragmento de código siguiente se muestra cómo establecer la validación de dígitos de comprobación:

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

Soporte y comentarios

Encontrar respuestas a sus preguntas

¿Tiene preguntas? Pregúntanos en nuestro foro de preguntas y respuestas de docs con la etiqueta UWP o en Stack Overflow con la etiqueta pointofservice.

Ayúdenos a encontrar sus preguntas:

  • Agregue la etiqueta pointofservice a su pregunta en Stack Overflow.
  • Incluir el término "UWP" en tu publicación en el foro de preguntas y respuestas

Consulte también