Compartir a través de


Trabajar con simbologías de escáner de código 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ódigos 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, Código 128, Código QR, etc.

Determine qué simbologías son compatibles

Dado que su aplicación se puede usar con diferentes modelos de escáneres de códigos de barras de varios fabricantes, es posible que desee consultar el escáner para determinar la lista de simbologías que admite. Esto puede ser útil si su aplicación requiere una simbología específica que puede no ser soportada por todos los escáneres o si necesita habilitar simbologías que se han deshabilitado manual o programáticamente en el escáner.

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

El siguiente ejemplo obtiene una lista de las simbologías admitidas por el escáner de códigos de barras y las muestra 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.

El siguiente ejemplo comprueba si el escáner de código de barras admite la simbología Code32:

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

Cambiar las simbologías reconocidas

En algunos casos, es posible que quiera 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 tiene intención de utilizar en su aplicación. Por ejemplo, para asegurarse de que un usuario escanea el código de barras correcto, podría restringir el escaneado a UPC o EAN cuando adquiera SKU de artículos y restringir el escaneado a Código 128 cuando adquiera números de serie.

Una vez que conozca las simbologías que admite su 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 se deshabilitan las omitidas de su lista.

El siguiente ejemplo establece 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

Las distintas simbologías de códigos de barras pueden tener atributos diferentes, como la compatibilidad con varias longitudes de descodificación, la transmisión del dígito de control al host como parte de los datos sin procesar y la validación del dígito de control. Con la clase BarcodeSymbologyAttributes, puede obtener y establecer estos atributos para un ClaimedBarcodeScanner y una simbología de código de barras determinados.

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 para un ClaimedBarcodeScanner.

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

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

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

Restringir los datos de escaneado por longitud de datos

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

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

  • AnyLength: decodifica longitudes de cualquier número.
  • Discreto: decodifica longitudes de caracteres de un byte DecodeLength1 o DecodeLength2.
  • Rango: Decodifica longitudes entre DecodeLength1 y DecodeLength2 caracteres de un byte. El orden de DecodeLength1 y DecodeLength2 no importa (cualquiera puede ser mayor o menor 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 control se transmitirá al host como parte de los datos sin procesar. Antes de definirlo, asegúrese de que la simbología admite la transmisión de dígitos de control con IsCheckDigitTransmissionSupported. A continuación, establezca si la transmisión de dígitos de control está activada con IsCheckDigitTransmissionEnabled.

El siguiente fragmento de código muestra la configuración de la transmisión de dígitos de control:

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 control del código de barras. Antes de configurar esto, asegúrese de que la simbología admite la validación de dígitos de control con IsCheckDigitValidationSupported. A continuación, establezca si la validación del dígito de control está activada con IsCheckDigitValidationEnabled.

El siguiente fragmento de código muestra la configuración de la validación de dígitos de control:

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 tus preguntas

¿Tienes alguna pregunta? Pregúntenos en nuestro foro de preguntas y respuestas Docs con la etiqueta UWP o en Stack Overflow con la etiqueta pointofservice.

Ayúdenos a localizar sus preguntas:

  • Agregue la etiqueta pointofservice a la pregunta en Stack Overflow.
  • Incluya el término "UWP" en su mensaje en el foro de preguntas y respuestas.

Consulte también