Compartilhar via


Trabalhar com simbologias de scanner de código de barras

Este tópico explica como usar as APIs de scanner de código de barras da Plataforma Universal do Windows (UWP) para processar simbologias de código de barras sem configurar manualmente o scanner.

Uma simbologia de código de barras é o mapeamento de dados para um formato de código de barras específico. Algumas simbologias comuns incluem UPC, Código 128, código QR e assim por diante.

Determinar quais simbologias são compatíveis

Como seu aplicativo pode ser usado com diferentes modelos de scanner de código de barras de vários fabricantes, convém consultar o scanner para determinar a lista de simbologias com as quais ele é compatível. Isso pode ser útil se o aplicativo exigir uma simbologia específica que pode não ser compatível com todos os scanners ou se você precisar habilitar simbologias que foram desativadas manual ou programaticamente no scanner.

Depois de ter um objeto BarcodeScanner usando BarcodeScanner.FromIdAsync, chame GetSupportedSymbologiesAsync para obter uma lista de simbologias compatíveis com o dispositivo.

O exemplo a seguir obtém uma lista das simbologias com suporte do scanner de código de barras e as exibe em um bloco 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 se uma simbologia específica é compatível

Para determinar se o scanner oferece suporte a uma simbologia específica, é possível chamar IsSymbologySupportedAsync.

O exemplo a seguir verifica se o scanner de código de barras oferece suporte à simbologia Code32:

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

Alterar quais simbologias são reconhecidas

Em alguns casos, convém usar um subconjunto de simbologias para as quais o scanner de código de barras oferece suporte. Isso é particularmente útil para bloquear simbologias que você não pretende usar no aplicativo. Por exemplo, para garantir que um usuário digitalize o código de barras correto, é possível restringir a digitalização para UPC ou EAN ao adquirir SKUs de item e restringir a digitalização ao Código 128 ao adquirir números de série.

Depois de conhecer as simbologias compatíveis com o scanner, é possível definir as simbologias que deseja que ele reconheça. Isso pode ser feito depois de estabelecer um objeto ClaimedBarcodeScanner usando ClaimScannerAsync. É possível chamar SetActiveSymbologiesAsync para habilitar um conjunto específico de simbologias enquanto as omitidas da lista estão desabilitadas.

O exemplo a seguir define as simbologias ativas de um scanner de código de barras reivindicado como Code39 e Code39Ex:

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

Atributos de simbologia de código de barras

Simbologias de código de barras diferentes podem ter atributos diferentes, como suporte a vários comprimentos de decodificação, transmissão do dígito de verificação para o host como parte dos dados brutos e validação de dígitos de verificação. Com a classe BarcodeSymbologyAttributes, é possível obter e definir esses atributos para um determinado ClaimedBarcodeScanner e simbologia de código de barras.

É possível obter os atributos de uma determinada simbologia com GetSymbologyAttributesAsync. O snippet de código a seguir obtém os atributos da simbologia Upca para um ClaimedBarcodeScanner.

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

Quando terminar de modificar os atributos e estiver pronto para defini-los, será possível chamar SetSymbologyAttributesAsync. Esse método retorna um bool, que é verdadeiro se os atributos foram definidos com êxito.

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

Restringir os dados de varredura por comprimento de dados

Algumas simbologias são de comprimento variável, como o Código 39 ou o Código 128. Os códigos de barras dessas simbologias podem ser localizados próximos uns dos outros, contendo dados diferentes, muitas vezes de comprimento específico. Definir o comprimento específico dos dados necessários pode evitar verificações inválidas.

Antes de definir o comprimento da decodificação, verifique se a simbologia do código de barras oferece suporte a vários comprimentos com IsDecodeLengthSupported. Depois de saber se ele é compatível, é possível definir o DecodeLengthKind, que é do tipo BarcodeSymbologyDecodeLengthKind. Essa propriedade pode ser definida com os seguintes valores:

  • AnyLength: decodifica comprimentos de qualquer número.
  • Discrete: decodifica comprimentos de caracteres de byte único DecodeLength1 e DecodeLength2.
  • Range: decodifica comprimentos de caracteres de byte único entre DecodeLength1 ou DecodeLength2. A ordem de DecodeLength1 e DecodeLength2 não importa (uma pode ser maior ou menor que a outra).

Finalmente, é possível definir os valores de DecodeLength1 e DecodeLength2 para controlar o comprimento dos dados necessários.

O snippet de código a seguir demonstra a configuração do comprimento da decodificação:

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

Transmissão de dígitos de verificação

Outro atributo que é possível definir em uma simbologia é se o dígito de verificação será transmitido ao host como parte dos dados brutos. Antes de definir isso, certifique-se de que a simbologia oferece suporte à transmissão de dígitos de verificação com IsCheckDigitTransmissionSupported. Em seguida, defina se a transmissão de dígitos de verificação está habilitada com IsCheckDigitTransmissionEnabled.

O trecho de código a seguir demonstra a configuração da transmissão de dígitos de verificação:

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

Validação de dígitos de verificação

Também é possível definir se o dígito de verificação do código de barras será validado. Antes de definir isso, certifique-se de que a simbologia oferece suporte à validaão de dígitos de verificação com IsCheckDigitTransmissionSupported. Em seguida, defina se a validação de dígito de verificação está habilitada com IsCheckDigitValidationEnabled.

O snippet de código a seguir demonstra a validação do dígito de verificação de configuração:

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

Suporte e comentários

Encontrar respostas para suas dúvidas

Tem dúvidas? Pergunte-nos em nosso fórum de P e R do Docs com a tag UWP ou no Stack Overflow com a tag pointofservice.

Ajude-nos a localizar suas perguntas:

  • Adicione a tag pointofservice à pergunta sobre Stack Overflow.
  • Incluir o termo "UWP" na sua postagem no fórum de P e R

Confira também