C#-Xamarin利用ZXing.Net.Mobile进行扫码

简介: C#-Xamarin利用ZXing.Net.Mobile进行扫码 前言 很多人觉得Xamarin的开源少,没法用来开发项目。 但,实际上Xamarin已经有很多开源代码了;只要不是特别特殊的项目,基本上是都可以满足开发。

C#-Xamarin利用ZXing.Net.Mobile进行扫码

前言

很多人觉得Xamarin的开源少,没法用来开发项目。

但,实际上Xamarin已经有很多开源代码了;只要不是特别特殊的项目,基本上是都可以满足开发。

下面我们来看一下Xamarin中利用开源代码ZXing.Net.Mobile进行扫码。

引用ZXing.Net.Mobile

在Xamarin中进行扫码,需要先引用开源代码ZXing.Net.Mobile。

下面我们先打开Nuget,搜索ZXing.Net.Mobile,如下图:

然后我们点击右侧安装。

接着VisualStudio可能会提示我们这样的错误。

错误 检测到 Xamarin.Android.Support.Compat 存在版本冲突。直接从项目引用包可解决此问题。 
SalesApp -> Xamarin.Android.Support.Design 25.4.0.2 -> Xamarin.Android.Support.Compat (= 25.4.0.2) 
SalesApp -> ZXing.Net.Mobile 2.4.1 -> Xamarin.Android.Support.v4 25.4.0.1 -> Xamarin.Android.Support.Compat (= 25.4.0.1). 

这是因为我们选择安装的ZXing.Net.Mobile依赖的DLL和我们项目的DLL对应不上。

解决办法很简单,选择下右侧ZXing.Net.Mobile的其他版本安装。

----------------------------------------------------------------------------------------------------

但在VisualStudio2017中有个非常坑的地方,就是nuget的引用会将相关dll都组织成一个包,然后一起引用,如下图:

看上去引用更简洁,按理说应该是好事,但这里有个问题就是,你引用的dll并没有被下载到本地。

也就是说,如果你网不好,或者断网,就别想调试了。

所以最终我还是选择把相关dll都下载下来,然后直接引用,相关dll如下图:

 

使用MobileBarcodeScanner扫码

本项目里,我们使用ZXing.Net.Mobile下的MobileBarcodeScanner类进行扫码。

下面简单介绍下MobileBarcodeScanner的使用方法。

首先,MobileBarcodeScanner类的实例需要调用Scan方法才会进行扫码。

而Scan方法被调用后,会自己打开了一个Activity。

而这个被打开的Activity的UI,就是,他对应的axml也是可以被自定义的。

自定义的方法就是Scan方法被调用前,为MobileBarcodeScanner类的CustomOverlay属性赋值。

有兴趣的同学可以查看下MobileBarcodeScanner的【源代码】,更深入的了解一些。

MobileBarcodeScanner的Scan方法有两个参数。

第一个参数是当前调用扫码的Activity,也可以传Null,传Null的话,MobileBarcodeScanner类里自己找Context为他赋值。

第二个参数是当前扫描的配置属性;为MobileBarcodeScanningOptions类型。

下面我们看调用代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
View  zxingOverlay;
MobileBarcodeScanner scanner;
protected override void OnCreate(Bundle savedInstanceState)
{
     base.OnCreate(savedInstanceState);
     SetContentView(Resource.Layout.MainActivity);
    
     Button btnScan = this.FindControl<Button>( "btnScan" );
     btnScan.Click += (s, e) =>
     {
         scanner = new MobileBarcodeScanner();
         Task t = new Task(AutoScan);
         t.Start();
     }; 
}
async void AutoScan()
{
     scanner.UseCustomOverlay =  true ;
     zxingOverlay = LayoutInflater.FromContext(this).Inflate(Resource.Layout.ZxingOverlay,  null );
     ImageView ivScanning = zxingOverlay.FindViewById<ImageView>(Resource.Id.ivScanning);
     Button btnCancelScan = zxingOverlay.FindViewById<Button>(Resource.Id.btnCancelScan);
     btnCancelScan.Click += (s, e) =>
     {
         if (scanner !=  null )
         {
             scanner.Cancel();
         }
     };
 
     zxingOverlay.Measure(MeasureSpecMode.Unspecified.GetHashCode(), MeasureSpecMode.Unspecified.GetHashCode());
     int  width = zxingOverlay.MeasuredWidth;
     int  height = zxingOverlay.MeasuredHeight;
 
     // 从上到下的平移动画
     Animation verticalAnimation = new TranslateAnimation(0, 0, 0, height);
     verticalAnimation.Duration = 3000; // 动画持续时间
     verticalAnimation.RepeatCount = Animation.Infinite; // 无限循环
 
     // 播放动画
     ivScanning.Animation = verticalAnimation;
     verticalAnimation.StartNow();
           
     scanner.CustomOverlay = zxingOverlay;
     var mbs = MobileBarcodeScanningOptions. Default ;
     mbs.AssumeGS1 =  true ;
     mbs.AutoRotate =  true ;
     mbs.DisableAutofocus =  false ;
     mbs.PureBarcode =  false ;
     mbs.TryInverted =  true ;
     mbs.TryHarder =  true ;
     mbs.UseCode39ExtendedMode =  true ;
     mbs.UseFrontCameraIfAvailable =  false ;
     mbs.UseNativeScanning =  true ;
 
     var result = await scanner.Scan(this, mbs);
     HandleScanResult(result);
 
void HandleScanResult(ZXing.Result result)
{
     if (result !=  null  && !string.IsNullOrEmpty(result.Text))
     {
         if (result.Text !=  null  && result.Text.Trim().Length > 5)
         {
             this.RunOnUi(() => { this.ShowToast(result.Text); });
 
         }
         else
         {
             this.RunOnUi(() => { this.ShowToast( "扫描无数据" ); });
         }
     }
     else
     {
         this.RunOnUi(() => { this.ShowToast( "扫描取消" ); });
     }
     scanner.Cancel(); 
}

如上代码所示,我们把项目中写好的ZxingOverlay.axml赋值给了MobileBarcodeScanner的CustomOverlay属性。

并且在赋值前,我们为页面内的btnCancelScan按钮定义了取消事件;同时还定义了一个扫描动画。

因为定义动画时,页面还没加载出来,所以要取高度进行动画移动的话,需要先进行下预测。

代码中调用了Measure方法进行预测,然后再取出预测的高度和宽度MeasuredHeight,MeasuredWidth进行动画操作。

----------------------------------------------------------------------------------------------------

最终扫描界面如下图所示:

----------------------------------------------------------------------------------------------------

到此扫码使用就介绍完了。

框架代码已经传到Github上了,欢迎大家下载。

Github地址:https://github.com/kiba518/KibaApp

原文地址https://www.cnblogs.com/kiba/p/10494428.html

相关文章
|
2月前
|
开发框架 C# Android开发
C#一分钟浅谈:Xamarin 移动应用开发
随着移动设备的普及,Xamarin 成为跨平台移动应用开发的重要工具,允许开发者使用 C# 编写一次代码,即可在 iOS、Android 和 Windows Phone 上运行。本文介绍 Xamarin 的基本概念、开发环境搭建、常见问题及解决方案,并通过代码示例详细讲解。
55 0
|
2月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
103 0
|
17天前
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
67 18
|
17天前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
48 12
|
15天前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
|
15天前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
|
15天前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
|
30天前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
41 5
|
1月前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
111 13
|
2月前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
66 7