Compartir a través de


Introducción a un escáner de códigos de barras de cámara

En este tema se describe cómo configurar un escáner básico de códigos de barras de cámara en una aplicación para UWP.

Nota:

El descodificador de software integrado en Windows 10/11 lo proporciona Digimarc Corporation.

Los fragmentos de código siguientes son solo para fines de demostración. Para obtener una muestra de trabajo completa, consulte el ejemplo de escáner de códigos de barras.

Paso 1: Agregar declaraciones de funcionalidad al manifiesto de la aplicación

  1. En Microsoft Visual Studio, en Explorador de soluciones, abra el editor del manifiesto de la aplicación haciendo doble clic en el elemento package.appxmanifest.
  2. Seleccione la pestaña Capacidades .
  3. Marque las casillas de la Webcam y de PointOfService.

Nota:

La capacidad de la Webcam es necesaria para que el decodificador de software reciba fotogramas de la cámara, con el fin de decodificar el código de barras y proporcionar una vista previa en la aplicación.

Paso 2: Agregar directivas de using

using Windows.Devices.Enumeration;
using Windows.Devices.PointOfService;

Paso 3: Definir el selector de dispositivos

Utilice uno de los métodos BarcodeScanner.GetDeviceSelector para obtener un objeto BarcodeScanner para cada escáner de códigos de barras conectado.

Opción A: Buscar todos los escáneres de códigos de barras

string selector = BarcodeScanner.GetDeviceSelector();

Opción B: Buscar todos los escáneres de códigos de barras según el alcance (para este ejemplo, filtramos por conexión tipo local )

string selector = BarcodeScanner.GetDeviceSelector(PosConnectionTypes.Local);
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

Paso 4: Enumerar escáneres de códigos de barras

Si no espera que la lista de dispositivos cambie durante la duración de la aplicación, use DeviceInformation.FindAllAsync para obtener una instantánea única. Sin embargo, si la lista de escáneres de códigos de barras podría cambiar durante el ciclo de vida de su aplicación, use un DeviceWatcher en su lugar.

Importante

El uso de GetDefaultAsync para enumerar dispositivos PointOfService puede dar lugar a un comportamiento incoherente, ya que solo devuelve el primer dispositivo encontrado en la clase (que puede cambiar de la sesión a la sesión).

Opción A: Enumerar una instantánea de todos los escáneres de códigos de barras conectados en función del selector creado en el paso 3

En este fragmento de código, creamos un objeto DeviceInformationCollection y usamos ***DeviceInformation.FindAllAsync para rellenarlo.

DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

Sugerencia

Consulte para enumerar una instantánea de dispositivos y obtener más información sobre el uso de DeviceInformation.FindAllAsync.

Opción B: Enumerar escáneres de códigos de barras disponibles en función del selector creado en el paso 3 y observar los cambios en esa colección

En este fragmento de código, creamos un DeviceWatcher mediante DeviceInformation.CreateWatcher.

DeviceWatcher deviceWatcher = DeviceInformation.CreateWatcher(selector);
watcher.Added += Watcher_Added;
watcher.Removed += Watcher_Removed;
watcher.Updated += Watcher_Updated;
watcher.Start();

Sugerencia

Para obtener más información, consulte Enumerar y ver dispositivos y DeviceWatcher.

Paso 5: Identificación de escáneres de códigos de barras de cámara

Un escáner de códigos de barras de cámara consta de una cámara (conectada a un equipo) combinada con un descodificador de software, que Windows empareja dinámicamente para crear un escáner de códigos de barras totalmente funcional para aplicaciones para la Plataforma universal de Windows (UWP).

BarcodeScanner.VideoDeviceID se puede usar para diferenciar entre escáneres de códigos de barras de cámara y escáneres de códigos de barras físicos. Un VideoDeviceID que no es NULL indica que el objeto del escáner de códigos de barras de la colección de dispositivos es un escáner de códigos de barras de cámara. Si tiene más de un escáner de códigos de barras de cámara, puede que quiera crear una colección independiente que excluya escáneres físicos de códigos de barras.

Los escáneres de códigos de barras de cámara que usan el descodificador que se incluye con Windows se identifican como:

Microsoft BarcodeScanner (nombre de la cámara aquí)

Si hay más de una cámara y están integradas en el chasis del equipo, el nombre podría diferenciar entre frontal y trasera.

Cuando se inicia el DeviceWatcher (consulte el Paso 4: Enumerar escáneres de códigos de barras), enumera cada dispositivo conectado. En el siguiente fragmento de código, agregamos cada escáner disponible a una colección BarcodeScanner y enlazamos la colección a un ListBox.

ObservableCollection<BarcodeScanner> barcodeScanners = 
  new ObservableCollection<BarcodeScanner>();

private async void Watcher_Added(DeviceWatcher sender, DeviceInformation args)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        barcodeScanners.Add(new BarcodeScanner(args.Name, args.Id));

        // Select the first scanner by default.
        if (barcodeScanners.Count == 1)
        {
            ScannerListBox.SelectedIndex = 0;
        }
    });
}

Cuando el SelectedIndex del ListBox cambia (el primer elemento se selecciona de forma predeterminada en el fragmento de código anterior), consultamos la información del dispositivo (la SelectScannerAsync tarea se implementa en el Paso 6: Reclamar el escáner de códigos de barras de la cámara).

private async void ScannerSelection_Changed(object sender, SelectionChangedEventArgs args)
{
    var selectedScannerInfo = (BarcodeScanner)args.AddedItems[0];
    var deviceId = selectedScannerInfo.DeviceId;

    await SelectScannerAsync(deviceId);
}

Paso 6: Reclamar el escáner de códigos de barras de la cámara

Llama a BarcodeScanner.ClaimScannerAsync para obtener el uso exclusivo del escáner de códigos de barras de la cámara.

private async Task SelectScannerAsync(string scannerDeviceId)
{
    selectedScanner = await BarcodeScanner.FromIdAsync(scannerDeviceId);

    if (selectedScanner != null)
    {
        claimedScanner = await selectedScanner.ClaimScannerAsync();
        if (claimedScanner != null)
        {
            await claimedScanner.EnableAsync();
        }
        else
        {
            rootPage.NotifyUser("Failed to claim the selected barcode scanner", NotifyType.ErrorMessage);
        }
    }
    else
    {
        rootPage.NotifyUser("Failed to create a barcode scanner object", NotifyType.ErrorMessage);
    }
}

Paso 7: Versión preliminar proporcionada por el sistema

Se requiere una vista previa de la cámara para ayudar al usuario a apuntar la cámara en un código de barras. Windows proporciona una vista previa básica de la cámara que inicia un cuadro de diálogo para controlar el escáner de códigos de barras de la cámara.

Llame a ClaimedBarcodeScanner.ShowVideoPreview para abrir el cuadro de diálogo y ClaimedBarcodeScanner.HideVideoPreview para cerrarlo.

Sugerencia

Consulte Vista previa de alojamiento para alojar la vista previa del escáner de códigos de barras de la cámara en tu aplicación.

Paso 8: Iniciar el examen

Puede iniciar el proceso de escaneo llamando a StartSoftwareTriggerAsync.

Dependiendo del valor de IsDisabledOnDataReceived, el escáner podría escanear solo un código de barras y luego detenerse o escanear continuamente hasta que llame a StopSoftwareTriggerAsync.

Establezca el valor deseado de IsDisabledOnDataReceived para controlar el comportamiento del escáner cuando se decodifica un código de barras.

Importancia Descripción
Cierto Escanear solo un código de barras y luego detener
Falso Escanear continuamente códigos de barras sin detener

Consulte también