如何使用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
相关产品推荐
相关产品推荐

