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 el Explorador de soluciones, abra el diseñador para el manifiesto de aplicación haciendo doble clic en el elemento package.appxmanifest.
  2. Seleccione la pestaña Funcionalidades.
  3. Active las casillas webcam y PointOfService.

Nota:

La funcionalidad webcam es necesaria para que el descodificador de software reciba fotogramas de la cámara para descodificar el código de barras y proporcionar una vista previa en la aplicación.

Paso 2: Agregar using directivas

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 en función del ámbito (para este ejemplo, filtramos el tipo de conexión 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 la duración de la aplicación, use un DeviceWatcher en su lugar.

Importante

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

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, creamos un objeto DeviceInformationCollection y utilizamos ****DeviceInformation.FindAllAsync para rellenarlo.

DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);

Sugerencia

Consulte Enumerar una instantánea de dispositivos para 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 DeviceWatchermedianteDeviceInformation.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, vea 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 las cámaras delanteras y traseras.

Cuando se inicia DeviceWatcher (consulte Paso 4: Enumerar escáneresde códigos de barras), enumera a través de 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 la clase SelectedIndex del ListBox cambia (el primer elemento se selecciona de forma predeterminada en el fragmento de código de la cámara), consultamos la información del dispositivo (la tarea SelectScannerAsync 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.ShowVideoPreviewpara abrir el cuadro de diálogo yClaimedBarcodeScanner.HideVideoPreviewpara cerrarlo.

Sugerencia

Consulte Cómo alojar la vista previa para alojar la vista previa del escáner de códigos de barras con cámara en su aplicación.

Paso 8: Iniciar el examen

Puede iniciar el proceso de examen llamando a StartSoftwareTriggerAsync.

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

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

Valor Descripción
True Escanear solo un código de barras y luego detener
False Escanear continuamente códigos de barras sin detener

Consulte también