DeviceInformation.FindAllAsync () ничего не делает - PullRequest
0 голосов
/ 18 июня 2019

Я уже 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;
        }
    });

}

, где код просто останавливается и ожидает без выдачи ошибки.

Так что, если кто-то может мне объяснить, почему он это делает и почему код не выдает никакой ошибки по прошествии определенного времени?

...