如何在.NET MAUI或Xamarin中使用设备集成条形码阅读器读取条码?
使用.NET MAUI/Xamarin调用设备集成条形码阅读器方案
由于设备集成的条形码阅读器属于硬件专属功能,没有跨平台统一API,需要针对不同平台编写平台特定代码,以下是各平台的实现方案:
安卓平台
多数带集成扫码模块的安卓设备(如工业平板、专业扫码枪)会采用两种输出方式:模拟键盘输入或厂商专属SDK。
1. 模拟键盘输入场景
这类设备扫码后会把条码内容以按键输入的形式发送到当前焦点控件,你只需监听文本输入或按键事件即可:
- 简单实现:给页面中的
Entry控件绑定Completed事件
<Entry x:Name="BarcodeEntry" Completed="BarcodeEntry_Completed" />
private void BarcodeEntry_Completed(object sender, EventArgs e) { string barcodeContent = BarcodeEntry.Text; // 这里处理扫码结果 }
- 全局监听:如果需要无焦点扫码,可通过依赖服务监听系统按键事件
首先定义共享接口:
public interface IBarcodeScanner { event EventHandler<string> BarcodeScanned; }
然后在安卓项目中实现:
[assembly: Dependency(typeof(AndroidBarcodeScanner))] namespace YourApp.Platforms.Android { public class AndroidBarcodeScanner : IBarcodeScanner, IDisposable { public event EventHandler<string> BarcodeScanned; private MainActivity _currentActivity; private string _scannedBuffer = ""; public AndroidBarcodeScanner() { _currentActivity = Platform.CurrentActivity as MainActivity; _currentActivity.KeyDown += OnKeyDown; } private void OnKeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keycode.Enter) { // 扫码器通常以回车作为结束符,可根据设备调整 BarcodeScanned?.Invoke(this, _scannedBuffer); _scannedBuffer = ""; e.Handled = true; } else { char inputChar = (char)e.GetUnicodeChar(); if (!char.IsControl(inputChar)) { _scannedBuffer += inputChar; } } } public void Dispose() { if (_currentActivity != null) { _currentActivity.KeyDown -= OnKeyDown; } } } }
2. 厂商专属SDK场景
霍尼韦尔、斑马等厂商会提供安卓专属SDK,你需要将厂商提供的aar文件添加到安卓项目,然后通过原生代码调用扫码接口,具体流程参考厂商官方文档。
iOS平台
带集成扫码模块的iOS设备(如企业级iPad)通常也会模拟键盘输入,或提供厂商SDK,处理逻辑类似安卓:
- 全局监听按键事件的依赖服务实现:
[assembly: Dependency(typeof(IosBarcodeScanner))] namespace YourApp.Platforms.iOS { public class IosBarcodeScanner : IBarcodeScanner { public event EventHandler<string> BarcodeScanned; private string _scannedBuffer = ""; public IosBarcodeScanner() { var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate; appDelegate?.AddKeyInputListener(OnKeyInputReceived); } private void OnKeyInputReceived(string input) { if (input == "\r") // 扫码结束符,按需调整 { BarcodeScanned?.Invoke(this, _scannedBuffer); _scannedBuffer = ""; } else { _scannedBuffer += input; } } } }
注:需要在iOS项目的AppDelegate中添加全局按键监听逻辑,通过方法交换或重写SendEvent实现。
Windows平台
Windows设备(如Surface系列带扫码模块)可直接调用UWP的PointOfService API:
using Windows.Devices.PointOfService; using Windows.Security.Cryptography; using Windows.Security.Cryptography.Core; public async Task InitWindowsBarcodeScanner() { var scanner = await BarcodeScanner.GetDefaultAsync(); if (scanner == null) return; var claimedScanner = await scanner.ClaimScannerAsync(); if (claimedScanner == null) return; claimedScanner.IsDecodeDataEnabled = true; claimedScanner.DataReceived += OnWindowsScannerDataReceived; await claimedScanner.EnableAsync(); } private void OnWindowsScannerDataReceived(BarcodeScanner sender, BarcodeScannerDataReceivedEventArgs args) { string barcodeContent = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, args.Report.ScanDataLabel); // 切换到UI线程处理结果 MainThread.BeginInvokeOnMainThread(() => { // 处理扫码内容 }); }
Xamarin实现思路
和MAUI逻辑一致,通过依赖服务针对各平台编写原生代码:
- Xamarin.Android:监听Activity按键事件或集成厂商SDK
- Xamarin.iOS:全局监听按键输入或集成厂商SDK
- Xamarin.Forms.UWP:调用
PointOfServiceAPI处理扫码
注意事项
- 不同设备的扫码结束符可能不同,常见的是回车、换行,需根据测试设备调整判断逻辑
- 使用厂商SDK时需遵循厂商文档配置权限和初始化流程
- 必须用真实的带集成阅读器的设备测试,模拟器无法模拟硬件扫码
内容的提问来源于stack exchange,提问作者Chaitanya Karra
相关产品推荐
相关产品推荐

