You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:34:53