Introdução a um scanner de código de barras com câmera
Este tópico descreve como configurar um leitor de código de barras de câmera básico em um aplicativo UWP.
Observação
O decodificador de software interno do Windows 10/11 é fornecido pela Digimarc Corporation.
Os trechos de código a seguir são apenas para fins de demonstração. Para obter uma amostra do trabalho concluído, consulte a amostra do leitor de Código de Barras .
Etapa 1: adicionar declarações de capacidade no manifesto do seu aplicativo
- No Microsoft Visual Studio, no Gerenciador de Soluções, abra o designer do manifesto do aplicativo clicando duas vezes no item package.appxmanifest.
- Selecione a guia Funcionalidades.
- Verifique as caixas de Webcam e PointOfService.
Observação
A funcionalidade Webcam é obrigatória para que o decodificador de software receba os quadros da câmera para decodificar o código de barras e fornecer uma prévia no seu aplicativo.
Etapa 2: adicionar as diretivas using
using Windows.Devices.Enumeration;
using Windows.Devices.PointOfService;
Etapa 3: definir seu seletor de dispositivos
Use um dos métodos BarcodeScanner.GetDeviceSelector para obter um objeto BarcodeScanner para cada leitor de código de barras conectado.
Opção A: encontrar todos os scanners de código de barras
string selector = BarcodeScanner.GetDeviceSelector();
Opção B: encontrar todos os scanners de código de barras com base na abrangência (neste exemplo, filtramos pelo tipo de conexão Local)
string selector = BarcodeScanner.GetDeviceSelector(PosConnectionTypes.Local);
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
Etapa 4: enumerar os scanners de código de barras
Se você não espera que a lista de dispositivos seja alterada durante a vida útil do seu aplicativo, utilize DeviceInformation.FindAllAsync para obter um instantâneo único. No entanto, se a lista de leitores de código de barras puder ser alterada durante a vida útil do aplicativo, utilize um DeviceWatcher.
Importante
Usar GetDefaultAsync para enumerar os dispositivos PointOfService pode resultar em um comportamento inconsistente, pois retorna apenas o primeiro dispositivo encontrado na classe (que pode ser alterado de uma sessão para outra).
Opção A: enumerar um instantâneo de todos os scanners de código de barras conectados com base no seletor criado na Etapa 3
Neste snippet, criamos um objeto DeviceInformationCollection e utilizamos ****DeviceInformation.FindAllAsync para preenchê-lo.
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
Dica
Consulte Enumerar um instantâneo de dispositivos para obter mais informações sobre o uso de DeviceInformation.FindAllAsync.
Opção B: enumerar os scanners de código de barras disponíveis com base no seletor criado na Etapa 3 e observar as alterações nessa coleção.
Neste snippet, criamos um DeviceWatcher usando DeviceInformation.CreateWatcher.
DeviceWatcher deviceWatcher = DeviceInformation.CreateWatcher(selector);
watcher.Added += Watcher_Added;
watcher.Removed += Watcher_Removed;
watcher.Updated += Watcher_Updated;
watcher.Start();
Dica
Para obter mais informações, consulte Enumerar e observar dispositivos e DeviceWatcher.
Etapa 5: identificar os scanners de código de barras da câmera
Um leitor de código de barras com câmera consiste em uma câmera (conectada a um computador) combinada com um decodificador de software, que o Windows emparelha dinamicamente para criar um leitor de código de barras totalmente funcional para aplicativos da Plataforma Universal do Windows (UWP).
BarcodeScanner.VideoDeviceID pode ser utilizado para diferenciar entre scanners de código de barras de câmera e scanners de código de barras físicos. Um VideoDeviceID diferente de nulo indica que o objeto de scanner de código de barras da sua coleção de dispositivos é um scanner de código de barras de câmera. Se você tiver mais de um scanner de código de barras com câmera, talvez deseje criar uma coleção separada que exclua os scanners de código de barras físicos.
Os scanners de código de barras com câmera que utilizam o decodificador fornecido com o Windows são identificados como:
Microsoft BarcodeScanner (nome da sua câmera aqui)
Se existir mais de uma câmera e elas estiverem integradas ao chassi do computador, o nome poderá diferenciar as câmeras frontal e traseira.
Quando o DeviceWatcher é iniciado (consulte Etapa 4: enumerar scanners de código de barras), ele enumera todos os dispositivos conectados. No trecho a seguir, adicionamos cada scanner disponível a uma coleção BarcodeScanner e associamos a coleção a uma 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;
}
});
}
Quando o SelectedIndex da ListBox é alterado (o primeiro item é selecionado por padrão no snippet anterior), consultamos as informações do dispositivo (a tarefa SelectScannerAsync
é implementada na Etapa 6: declarar o leitor de código de barras da câmera).
private async void ScannerSelection_Changed(object sender, SelectionChangedEventArgs args)
{
var selectedScannerInfo = (BarcodeScanner)args.AddedItems[0];
var deviceId = selectedScannerInfo.DeviceId;
await SelectScannerAsync(deviceId);
}
Etapa 6: declarar o scanner de código de barras da câmera
Chame BarcodeScanner.ClaimScannerAsync para obter o uso exclusivo do leitor de código de barras da câmera.
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);
}
}
Etapa 7: prévia fornecida pelo sistema
Uma prévia da câmera é obrigatória para ajudar o usuário a apontar a câmera para um código de barras. O Windows fornece uma prévia básica da câmera que abre uma caixa de diálogo para controlar o leitor de código de barras da câmera.
Chame ClaimedBarcodeScanner.ShowVideoPreview para abrir a caixa de diálogo e ClaimedBarcodeScanner.HideVideoPreview para fechá-la.
Dica
Consulte Prévia da Hospedagem para hospedar a prévia do leitor de código de barras da câmera no seu aplicativo.
Etapa 8: iniciar a verificação
Você pode iniciar o processo de verificação chamando StartSoftwareTriggerAsync.
Dependendo do valor de IsDisabledOnDataReceived, o scanner poderá verificar apenas um código de barras e parar ou verificar continuamente até que você chame StopSoftwareTriggerAsync.
Defina o valor desejado de IsDisabledOnDataReceived para controlar o comportamento do scanner quando um código de barras for decodificado.
Valor | Descrição |
---|---|
Verdadeiro | Verificar apenas um código de barras e depois parar |
Falso | Verificação contínua e sem paradas dos códigos de barras |