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

如何使用ZXing.Net.Mobile库在Xamarin.Android中读取PDF-417二维条码

嘿,我来帮你一步步搞定用ZXing.Net.Mobile在Xamarin.Android里扫描PDF-417条码并处理Base64结果的功能~

第一步:先把项目配置好

首先得确保你的项目正确引入了ZXing的包,并且配置好必要的权限:

  • 打开NuGet包管理器,搜索并安装 ZXing.Net.Mobile 和 ZXing.Net.Mobile.Android 这两个包
  • 在AndroidManifest.xml里添加相机相关权限(扫描必须用到相机):
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

另外,Android 6.0及以上版本需要动态请求相机权限,这个我会在代码里处理。

第二步:完整的扫描Activity代码

我把你提供的代码补全并加上详细注释,直接用就行:

using Android.App;
using Android.Widget;
using Android.OS;
using ZXing.Mobile;
using Android.Content.PM;
using System;

namespace YourAppNamespace // 替换成你自己的应用命名空间
{
    [Activity(Label = "PDF417Scanner", Theme = "@style/AppTheme", ScreenOrientation = ScreenOrientation.Portrait)]
    public class PDF417ScannerActivity : Activity
    {
        private MobileBarcodeScanner _barcodeScanner;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            // 加载布局(下面会给出简单的布局示例)
            SetContentView(Resource.Layout.ScannerLayout);

            // 初始化扫描器实例
            _barcodeScanner = new MobileBarcodeScanner(this);
            // 使用默认扫描界面,也可以改成true自定义界面
            _barcodeScanner.UseCustomOverlay = false;
            // 设置扫描界面的提示文字
            _barcodeScanner.TopText = "请对准PDF-417条码";
            _barcodeScanner.BottomText = "保持手机稳定";

            // 绑定扫描按钮的点击事件
            var scanButton = FindViewById<Button>(Resource.Id.btn_start_scan);
            scanButton.Click += async (sender, e) => await StartScanning();
        }

        private async System.Threading.Tasks.Task StartScanning()
        {
            // 先检查相机权限是否已授予
            if (CheckSelfPermission(Manifest.Permission.Camera) != Permission.Granted)
            {
                // 请求相机权限,请求码100用来区分权限请求
                RequestPermissions(new[] { Manifest.Permission.Camera }, 100);
                return;
            }

            // 配置扫描选项:只识别PDF-417格式的条码,过滤其他格式提高效率
            var scanOptions = new MobileBarcodeScanningOptions
            {
                PossibleFormats = new[] { BarcodeFormat.PDF_417 }
            };

            // 启动扫描,等待结果返回
            var scanResult = await _barcodeScanner.Scan(scanOptions);

            // 处理扫描结果
            if (scanResult != null && !string.IsNullOrWhiteSpace(scanResult.Text))
            {
                // 回到UI线程更新界面(因为扫描是异步操作)
                RunOnUiThread(() =>
                {
                    // scanResult.Text就是条码里存储的Base64字符串
                    Toast.MakeText(this, $"扫描到Base64内容:{scanResult.Text}", ToastLength.Long).Show();

                    // 如果需要把Base64解码成原始数据,比如文本或文件,参考下面的代码
                    try
                    {
                        // 将Base64字符串转成字节数组
                        byte[] decodedBytes = Convert.FromBase64String(scanResult.Text);
                        // 这里假设原始数据是UTF8编码的文本,你可以根据实际情况调整编码或用途
                        string decodedContent = System.Text.Encoding.UTF8.GetString(decodedBytes);
                        Toast.MakeText(this, $"解码后内容:{decodedContent}", ToastLength.Long).Show();
                    }
                    catch (FormatException ex)
                    {
                        // 捕获Base64格式错误的异常
                        Toast.MakeText(this, $"Base64解码失败:{ex.Message}", ToastLength.Long).Show();
                    }
                });
            }
            else
            {
                Toast.MakeText(this, "扫描取消或未识别到有效条码", ToastLength.Short).Show();
            }
        }

        // 处理权限请求的回调
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
        {
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == 100)
            {
                if (grantResults.Length > 0 && grantResults[0] == Permission.Granted)
                {
                    // 用户同意了相机权限,重新启动扫描
                    StartScanning();
                }
                else
                {
                    Toast.MakeText(this, "需要相机权限才能进行条码扫描", ToastLength.Short).Show();
                }
            }
        }
    }
}
第三步:配套的简单布局文件

创建一个名为ScannerLayout.axml的布局文件,放在Resources/Layout目录下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="16dp">

    <Button
        android:id="@+id/btn_start_scan"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始扫描PDF-417条码"
        android:textSize="18sp" />

</LinearLayout>
几个关键注意点提醒
  • 限制扫描格式:一定要设置PossibleFormats为PDF_417,这样扫描器只会识别这种条码,避免误扫其他格式,也能加快识别速度
  • 权限处理:Android 6.0+必须动态请求相机权限,不然应用会直接崩溃,代码里已经包含了这部分逻辑
  • Base64解码:扫描得到的scanResult.Text就是条码里的Base64字符串,直接用Convert.FromBase64String解码即可,如果解码失败记得捕获FormatException
  • 自定义界面:如果默认扫描界面不符合需求,可以设置_barcodeScanner.UseCustomOverlay = true,然后加载自己的自定义布局,具体可以根据需求调整

内容的提问来源于stack exchange,提问作者Seggie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:47:09