天天看點

C#-Xamarin利用ZXing.Net.Mobile進行掃碼

C#-Xamarin利用ZXing.Net.Mobile進行掃碼

前言

很多人覺得Xamarin的開源少,沒法用來開發項目。

但,實際上Xamarin已經有很多開源代碼了;隻要不是特别特殊的項目,基本上是都可以滿足開發。

下面我們來看一下Xamarin中利用開源代碼ZXing.Net.Mobile進行掃碼。

引用ZXing.Net.Mobile

在Xamarin中進行掃碼,需要先引用開源代碼ZXing.Net.Mobile。

下面我們先打開Nuget,搜尋ZXing.Net.Mobile,如下圖:

C#-Xamarin利用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都組織成一個包,然後一起引用,如下圖:

C#-Xamarin利用ZXing.Net.Mobile進行掃碼

看上去引用更簡潔,按理說應該是好事,但這裡有個問題就是,你引用的dll并沒有被下載下傳到本地。

也就是說,如果你網不好,或者斷網,就别想調試了。

是以最終我還是選擇把相關dll都下載下傳下來,然後直接引用,相關dll如下圖:

C#-Xamarin利用ZXing.Net.Mobile進行掃碼

使用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類型。

下面我們看調用代碼。

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進行動畫操作。

最終掃描界面如下圖所示:

C#-Xamarin利用ZXing.Net.Mobile進行掃碼

到此掃碼使用就介紹完了。

架構代碼已經傳到Github上了,歡迎大家下載下傳。

Github位址:

https://github.com/kiba518/KibaApp

原文位址

https://www.cnblogs.com/kiba/p/10494428.html

繼續閱讀