次の方法で共有


バーコードスキャナーのシンボル体系の操作

このトピックでは、ユニバーサル Windows プラットフォーム (UWP) バーコード スキャナー API を使用して、スキャナーを手動で構成せずにバーコード シンボルを処理する方法について説明します。

バーコード シンボルは、特定のバーコード形式へのデータのマッピングです。 一般的なシンボル体系としては、UPC、コード 128、QR コードなどがあります。

サポートされているシンボルを決定する

アプリケーションは複数の製造元の異なるバーコード スキャナー モデルで使用される場合があるため、スキャナーに対してクエリを実行して、サポートされているシンボルの一覧を特定できます。 これは、アプリケーションで、すべてのスキャナーでサポートされていない特定のシンボルが必要な場合や、スキャナーで手動またはプログラムによって無効にされたシンボルを有効にする必要がある場合に便利です。

BarcodeScanner.FromIdAsync を使用して BarcodeScanner オブジェクトを取得したら、GetSupportedSymbologiesAsync を呼び出して、デバイスでサポートされているシンボルの一覧を取得します。

次の例では、バーコード スキャナーでサポートされているシンボル体系の一覧を取得し、テキスト ブロックに表示します。

private void DisplaySupportedSymbologies(BarcodeScanner barcodeScanner, TextBlock textBlock) 
{
    var supportedSymbologies = await barcodeScanner.GetSupportedSymbologiesAsync();

    foreach (uint item in supportedSymbologies)
    {
        string symbology = BarcodeSymbologies.GetName(item);
        textBlock.Text += (symbology + "\n");
    }
}

特定のシンボルがサポートされているかどうかを判断する

スキャナーで特定のシンボル体系がサポートされているかどうかを判別するには、IsSymbologySupportedAsync を呼び出します。

次の例では、バーコード スキャナーで Code32 シンボル体系がサポートされているかどうかをチェックします。

bool symbologySupported = await barcodeScanner.IsSymbologySupportedAsync(BarcodeSymbologies.Code32);

認識されるシンボル体系の変更

場合によっては、バーコード スキャナーでサポートされるシンボルのサブセットを使用できます。 これは、アプリケーションで使用しないシンボルをブロックする場合に特に便利です。 たとえば、ユーザーが適切なバーコードを確実にスキャンできるように、アイテム SKU を取得するときにスキャンを UPC または EAN に制限し、シリアル番号を取得するときにスキャンをコード 128 に制限することができます。

スキャナーでサポートされているシンボルがわかったら、認識するシンボルを設定できます。 これは、ClaimScannerAsyc を使用して ClaimedBarcodeScanner オブジェクトを設定した後で行うことができます。 SetActiveSymbologiesAsyncを呼び出して特定のシンボル セットを有効にすることができますが、一覧から省略されたシンボルは無効になります。

次の例では、要求されたバーコード スキャナーのアクティブなシンボルを Code39Code39Ex に設定します。

private async void SetSymbologies(ClaimedBarcodeScanner claimedBarcodeScanner) 
{
    var symbologies = new List<uint>{ BarcodeSymbologies.Code39, BarcodeSymbologies.Code39Ex };
    await claimedBarcodeScanner.SetActiveSymbologiesAsync(symbologies);
}

バーコードのシンボル体系の属性

異なるバーコード シンボル体系では、使用される属性が異なる場合があります (複数のデコード長のサポート、チェック ディジットの生データの一部としてのホストへの送信、チェック ディジットの検証など)。 BarcodeSymbologyAttributes クラスを使用すると、特定の ClaimedBarcodeScanner とバーコードのシンボル体系のこれらの属性を取得して設定できます。

特定のシンボル体系の属性は、GetSymbologyAttributesAsync を使用して取得できます。 次のコード スニペットでは、ClaimedBarcodeScanner の Upca シンボル体系の属性を取得します。

BarcodeSymbologyAttributes barcodeSymbologyAttributes = 
    await claimedBarcodeScanner.GetSymbologyAttributesAsync(BarcodeSymbologies.Upca);

属性の変更が完了し、それらを設定する準備ができたら、SetSymbologyAttributesAsync を呼び出すことができます。 このメソッドでは bool が返されます。これは、属性が正常に設定された場合、true です。

bool success = await claimedBarcodeScanner.SetSymbologyAttributesAsync(
    BarcodeSymbologies.Upca, barcodeSymbologyAttributes);

データ長によるスキャン データの制限

一部のシンボルは、コード 39 やコード 128 などの可変長です。 これらのシンボル体系のバーコードは、それぞれが近くに配置されていて、多くの場合、特定の長さの異なるデータが含まれていることがあります。 必要なデータの特定の長さを設定すると、無効なスキャンを防ぐことができます。

デコードの長さを設定する前に、IsDecodeLengthSupported を使用して、バーコードのシンボル体系で複数の長さがサポートされるかどうかを確認します。 サポートされていることがわかったら、BarcodeSymbologyDecodeLengthKind 型の DecodeLengthKind を設定できます。 このプロパティには次の値を設定できます。

  • AnyLength: すべての長さをデコードします。
  • Discrete: DecodeLength1 または DecodeLength2 の 1 バイト文字の長さをデコードします。
  • Range: DecodeLength1DecodeLength2 の間の 1 バイト文字の長さをデコードします。 DecodeLength1DecodeLength2 の順序は重要ではありません (どちらかがもう一方より大きくても小さくてもかまいません)。

最後に、DecodeLength1DecodeLength2 の値を設定すると、必要なデータの長さを制御できます。

デコードの長さを設定するコード スニペットを次に示します。

private async Task<bool> SetDecodeLength(
    ClaimedBarcodeScanner scanner,
    uint symbology, 
    BarcodeSymbologyDecodeLengthKind kind, 
    uint decodeLength1, 
    uint decodeLength2)
{
    bool success = false;
    BarcodeSymbologyAttributes attributes = await scanner.GetSymbologyAttributesAsync(symbology);

    if (attributes.IsDecodeLengthSupported)
    {
        attributes.DecodeLengthKind = kind;
        attributes.DecodeLength1 = decodeLength1;
        attributes.DecodeLength2 = decodeLength2;
        success = await scanner.SetSymbologyAttributesAsync(symbology, attributes);
    }

    return success;
}

チェック ディジットの送信

シンボル体系に設定できるもう 1 つの属性は、チェック ディジットが生データの一部としてホストに送信されるかどうかです。 これを設定する前に、IsCheckDigitTransmissionSupported を使用して、シンボル体系でチェック ディジットの送信がサポートされていることを確認します。 次に、IsCheckDigitTransmissionEnabled を使用して、チェック ディジットの送信が有効であるかどうかを設定します。

次のコード スニペットは、チェック ディジットの送信の設定を示しています。

private async Task<bool> SetCheckDigitTransmission(ClaimedBarcodeScanner scanner, uint symbology, bool isEnabled)
{
    bool success = false;
    BarcodeSymbologyAttributes attributes = await scanner.GetSymbologyAttributesAsync(symbology);

    if (attributes.IsCheckDigitTransmissionSupported)
    {
        attributes.IsCheckDigitTransmissionEnabled = isEnabled;
        success = await scanner.SetSymbologyAttributesAsync(symbology, attributes);
    }

    return success;
}

チェック ディジットの検証

バーコードのチェック ディジットを検証するかどうかを設定することもできます。 これを設定する前に、IsCheckDigitValidationSupported を使用して、シンボル体系でチェック ディジットの検証がサポートされていることを確認します。 次に、IsCheckDigitValidationEnabled を使用して、チェック ディジットの検証が有効であるかどうかを設定します。

次のコード スニペットは、チェック ディジットの検証の設定を示しています。

private async Task<bool> SetCheckDigitValidation(ClaimedBarcodeScanner scanner, uint symbology, bool isEnabled)
{
    bool success = false;
    BarcodeSymbologyAttributes attributes = await scanner.GetSymbologyAttributesAsync(symbology);

    if (attributes.IsCheckDigitValidationSupported)
    {
        attributes.IsCheckDigitValidationEnabled = isEnabled;
        success = await scanner.SetSymbologyAttributesAsync(symbology, attributes);
    }

    return success;
}

サポートとフィードバック

質問に対する回答を見つける

ご質問があるでしょうか。 Docs Q&A フォーラムで UWP タグを使用するか、Stack Overflow で pointofservice タグを使用して質問してください。

質問を見つけやすくするために、次のようにしてください。

  • Stack Overflow で質問に pointofservice タグを追加します。
  • Q&A フォーラムの投稿に "UWP" という用語を含める

関連項目