使用條碼掃描器符號系統
本主題介紹如何使用通用 Windows 平台 (UWP) 條碼掃描器 API 來處理條碼符號系統,而無需手動設定掃描器。
條碼符號是資料與特定條碼格式的對應。 一些常見的符號包括 UPC、Code 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,並在取得序號時將掃描限制為 Code 128。
一旦您知道掃描器支援的符號系統,您就可以設定您希望掃描器識別的符號系統。 這可以在您使用 ClaimScannerAsync 建立 ClaimedBarcodeScanner 物件之後完成。 您可以呼叫 SetActiveSymbologiesAsync 來啟用一組特定的符號,同時停用從清單中省略的符號。
下列範例會將宣告條碼掃描器的作用中符號設定為 Code39 和 Code39Ex:
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);
依資料長度限制掃描資料
某些符號是可變長度,例如 Code 39 或 Code 128。 這些符號的條碼可以彼此接近,其中包含通常特定長度的不同資料。 設定所需資料的具體長度可以防止無效掃描。
設定譯碼長度之前,請先檢查條碼符號是否支援 IsDecodeLengthSupported 的多個長度。 一旦知道支援,您可以設定 DecodeLengthKind,其類型為 BarcodeSymbologyDecodeLengthKind。 此屬性可以是以下任意值:
- AnyLength:譯碼任何數字的長度。
- 離散:譯碼 DecodeLength1 或 DecodeLength2 單位元組字元的長度。
- 範圍:譯碼 DecodeLength1 與 DecodeLength2 單位元組字元之間的長度。 DecodeLength1 和 DecodeLength2 的順序並不重要 (可以是高於或低於另一個)。
最後,您可以設定 DecodeLength1 和 DecodeLength2 的值,以控制所需的資料長度。
下列代碼段示範如何設定譯碼長度:
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;
}
檢查數位傳輸
您可以在符號系統上設定的另一個屬性是校驗位是否將作為原始資料的一部分傳輸到主機。 設定此選項之前,請確定符號系統支援使用 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;
}
支援和意見反應
尋找您的問題解答
有任何疑問嗎? 在具有UWP標籤的 Docs Q&A 論壇上,或使用 pointofservice 標籤在 Stack Overflow 上詢問我們。
協助我們找出您的問題:
- 將 pointofservice 標籤新增至 Stack Overflow 的問題。
- 在 問&答論壇的貼文中包含 「UWP」 字詞