什么时候可以调用`BarcodeScanner.GetDefaultAsync()`?

时间:2014-10-22 00:49:07

标签: c# windows-runtime barcode-scanner

我正在尝试使用新的Windows 8.1 Point of Service API条形码扫描程序,如果我从以下任何位置拨打GetDefaultAsync(),则会返回null

  • App.OnLaunched
  • 第一页.Loaded
  • 第一页OnNavigatedTo
  • 第一页构造函数

这似乎不是DeviceCapabilities或驱动程序的问题,因为如果我从以下地方调用它,它将完美运行:

  • 按钮Click事件处理程序
  • 第一页' s OnGotFocus
  • 第一页的构造函数如果包含在:
    this.Dispatcher.RunIdleAsync(e => { var res = await BarcodeScanner.GetDefaultAsync(); Assert(res != null); });
  • 后续页面的构造函数

这让我怀疑你必须专注于访问POS设备,以及构造函数等。在收到焦点之前被调用。

问题:是否有关于的指导,您可以致电GetDefaultAsync()

1 个答案:

答案 0 :(得分:0)

松散地关注Microsoft Sample BarcodeScanner我在OnNavigatedTo中连接条形码扫描器没有任何困难,尽管BarcodeScanner.GetDefaultAsync()调用有点嵌套。

我在OnNavigatedTo声明了扫描程序,因为此特定页面的要点是扫描条形码,如果由于某种原因未找到/声明扫描程序我想要预先出错,我不希望页面看起来和如果不是,我会感觉很有用,我不想强​​迫用户在发现条形码扫描器不工作之前尝试扫描。

我无法告诉您为什么在不查看更多代码的情况下,在您的特定情况下,在不同位置进行呼叫无效,但我建议您尝试以下操作。

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        EnableScanner();
    }

private async void EnableScanner()
    {
        if (await CreateDefaultScannerObject())
        {
            // after successful creation, claim the scanner for exclusive use and enable it so that data reveived events are received.
            if (await ClaimScanner())
            {
                Task<bool> AsyncSuccess = EnableClaimedScanner();
                bool x = await AsyncSuccess;
                if (x)
                {
                    HookUpEventsClaimedScanner();
                }
            }
        }
    }
        private async Task<bool> CreateDefaultScannerObject()
    {
        if (scanner == null)
        {
            UpdateOutput("Creating Barcode Scanner object.");
            scanner = await BarcodeScanner.GetDefaultAsync();

            if (scanner != null)
            {
                UpdateOutput("Default Barcode Scanner created.");
                UpdateOutput("Device Id is:" + scanner.DeviceId);
            }
            else
            {
                UpdateOutput("Barcode Scanner not found. Please connect a Barcode Scanner.");
                return false;
            }
        }
        return true;
    }

    private async Task<bool> EnableClaimedScanner()
    {
        bool result = false;
        try
        {
            await claimedScanner.EnableAsync();
            if (claimedScanner.IsEnabled)
            {
                claimedScanner.IsDecodeDataEnabled = true;
                UpdateOutput("ClaimedScanner is now Enabled.");
                result = true;
            }
            else
                UpdateOutput("ClaimedScanner wasn't Enabled.");
        }
        catch (Exception ex)
        {
            UpdateOutput( ex.Message);
        }
        return result;
    }

    public void HookUpEventsClaimedScanner()
    {
        claimedScanner.DataReceived += ScannerDataReceived;
        claimedScanner.ReleaseDeviceRequested += ScannerReleaseRequest;
    }
编辑:我意识到这个问题已经超过一年了,但我发现它在我自己的Windows 8.1嵌入式条形码扫描仪的研究中,所以我想确保它不会导致任何其他人沿着错误的路径思考GetDefaultAsync在某些通话情况下无法工作。