Я уже 3 недели пользуюсь камерой BarcodeScanner
(API BarcodeScanner от Microsoft) в своем приложении UWP.
Работает хорошо, но иногда окно предварительного просмотра штрих-кода не открывается и BarcodeScanner
не включается.
Когда я понял это, я взял свое приложение в режиме отладки, чтобы увидеть, где была проблема и были ли выброшены исключения.
Вот как я инициализирую BarcodeScanner
:
public async Task ClaimScannerAsync()
{
string selector = Windows.Devices.PointOfService.BarcodeScanner.GetDeviceSelector();
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
if (_scanner == null)
_scanner = await Windows.Devices.PointOfService.BarcodeScanner.FromIdAsync(deviceCollection[0].Id);
if (_scanner != null)
{
if (_claimedBarcodeScanner == null)
_claimedBarcodeScanner = await _scanner.ClaimScannerAsync();
if (_claimedBarcodeScanner != null)
{
_claimedBarcodeScanner.DataReceived += ClaimedBarcodeScanner_DataReceivedAsync;
_claimedBarcodeScanner.ReleaseDeviceRequested += ClaimedBarcodeScanner_ReleaseDeviceRequested;
_claimedBarcodeScanner.IsDecodeDataEnabled = true;
_claimedBarcodeScanner.IsDisabledOnDataReceived = true;
await _claimedBarcodeScanner.EnableAsync();
//await _claimedBarcodeScanner.ShowVideoPreviewAsync();
await _claimedBarcodeScanner.StartSoftwareTriggerAsync();
await StartPreviewAsync();
Debug.WriteLine("Barcode Scanner claimed");
}
}
}
... и проблема, похоже, исходит из строки:
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
Вызывается в:
internal async Task OnBarcodeExecuted(object dataContext)
{
try
{
CurrentDataContext = dataContext;
_scanner.Subscribe(OnBarcodeReceived);
await _scanner.ClaimScannerAsync();
}
catch(Exception e)
{
Debug.WriteLine(e.Message);
}
}
OnBarcodeReceived
в моей ViewModel:
private void OnBarcodeReceived(string barcode)
{
var ignored = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
if(CurrentDataContext is IScannable)
{
IScannable item = (IScannable)CurrentDataContext;
item.NumSerie = barcode;
}
});
}
, где код просто останавливается и ожидает без выдачи ошибки.
Так что, если кто-то может мне объяснить, почему он это делает и почему код не выдает никакой ошибки по прошествии определенного времени?