如何在.NET MAUI安卓应用中使用专用条码扫描器(非相机)读取条码
.NET MAUI 安卓专用条码扫描器+相机扫码实现方案
一、专用扫描器(BroadcastReceiver 实现)
安卓手持设备的专用扫描器大多通过系统广播推送扫码结果,以下是MAUI中的落地步骤:
1. 配置广播接收器(AndroidManifest.xml)
先在安卓项目的AndroidManifest.xml里添加权限和广播过滤规则,注意:不同设备的Action值不同,Tera P172的官方Action一般是com.tera.scan.action.BARCODE_RECEIVED,不确定的话可以用adb shell logcat -s Intent抓扫码时的广播日志查看:
<!-- 添加基础权限 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 注册广播接收器 --> <receiver android:name="YourAppName.ScanReceiver"> <intent-filter> <action android:name="com.tera.scan.action.BARCODE_RECEIVED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>
2. 实现广播接收器类
在安卓项目中创建ScanReceiver.cs,通过静态事件把扫码结果传递给MAUI页面:
[BroadcastReceiver(Enabled = true)] [IntentFilter(new[] { "com.tera.scan.action.BARCODE_RECEIVED" })] public class ScanReceiver : BroadcastReceiver { // 定义静态事件供页面订阅 public static event Action<string> BarcodeScanned; public override void OnReceive(Context context, Intent intent) { if (intent == null || !intent.Action.Equals("com.tera.scan.action.BARCODE_RECEIVED")) return; // 获取条码值,Tera设备的Extra Key一般是"barcode"或"scan_result",不确定就抓日志看 string barcode = intent.GetStringExtra("barcode"); if (!string.IsNullOrEmpty(barcode)) { BarcodeScanned?.Invoke(barcode); } } }
3. 页面中触发扫码并等待结果
在需要扫码的页面(比如ScanPage.xaml.cs)里,通过TaskCompletionSource实现等待扫码完成的阻塞逻辑:
private TaskCompletionSource<string> _scanTaskSource; private async void StartScanBtn_Clicked(object sender, EventArgs e) { // 显示扫码提示(可选) await DisplayAlert("提示", "请对准条码扫描", "确认"); // 初始化任务源,准备等待扫码结果 _scanTaskSource = new TaskCompletionSource<string>(); ScanReceiver.BarcodeScanned += OnBarcodeReceived; // 阻塞等待扫码完成 string scannedBarcode = await _scanTaskSource.Task; // 取消事件订阅,避免内存泄漏 ScanReceiver.BarcodeScanned -= OnBarcodeReceived; // 扫码完成后的后续操作 await DisplayAlert("扫码成功", $"条码内容:{scannedBarcode}", "确定"); } private void OnBarcodeReceived(string barcode) { // 把扫码结果传递给等待的任务 _scanTaskSource?.SetResult(barcode); }
二、相机扫码方案(备用切换)
如果需要切换到相机扫码,推荐用ZXing.Net.Maui库,实现简单且兼容性好:
1. 安装NuGet包
在项目中安装ZXing.Net.Maui包。
2. 配置权限
在安卓项目的AndroidManifest.xml添加相机权限:
<uses-permission android:name="android.permission.CAMERA" />
3. 页面中实现相机扫码
private async void StartCameraScanBtn_Clicked(object sender, EventArgs e) { // 先申请相机权限 var status = await Permissions.RequestAsync<Permissions.Camera>(); if (status != PermissionStatus.Granted) { await DisplayAlert("权限不足", "请允许相机权限后重试", "确定"); return; } // 启动扫码 var scanner = new ZXing.Net.Maui.BarcodeScanner(); var scanResult = await scanner.ScanAsync(); if (scanResult != null) { await DisplayAlert("扫码成功", $"条码内容:{scanResult.Text}", "确定"); // 后续操作 } }
三、扫码方式切换逻辑
可以通过Preferences保存用户选择的扫码方式,在扫码入口处判断:
// 从设置读取用户选择:true=专用扫描器,false=相机 bool useDedicatedScanner = Preferences.Get("UseDedicatedScanner", true); private async void StartScan_Clicked(object sender, EventArgs e) { if (useDedicatedScanner) { await RunDedicatedScan(); // 调用上面的专用扫描器方法 } else { await RunCameraScan(); // 调用上面的相机扫码方法 } }
关键提示
- 不同品牌设备的广播Action和Extra Key差异很大,必须查设备官方开发文档,或者用
adb logcat抓包确认具体值 - 广播接收器的静态事件一定要在使用后取消订阅,防止内存泄漏
- 相机扫码必须先申请权限,否则会直接失败
内容的提问来源于stack exchange,提问作者Adrian Loughman
相关产品推荐
相关产品推荐

