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

来源:https://www.cnblogs.com/kiba/archive/2019/03/13/10494428.html
-Advertisement-
Play Games

前言 很多人覺得Xamarin的開源少,沒法用來開發項目。 但,實際上Xamarin已經有很多開源代碼了;只要不是特別特殊的項目,基本上是都可以滿足開發。 下麵我們來看一下Xamarin中利用開源代碼ZXing.Net.Mobile進行掃碼。 引用ZXing.Net.Mobile 在Xamarin中 ...


前言

很多人覺得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類型。

下麵我們看調用代碼。

 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上了,歡迎大家下載。

相關文章:

C#-Xamarin的Android項目開發(三)——發佈、部署、打包

C#-Xamarin的Android項目開發(二)——控制項應用

C#-Xamarin的Android項目開發(一)——創建項目

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

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

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯,請點擊下右下角的推薦】,非常感謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在看多線程經典書籍Java併發變成實戰,很多概念有疑惑,雖然工作中很少用到多線程,但覺得還是自己太弱了。加油。記一些隨筆。下麵簡單介紹一下線程。 一 線程與進程 進程與線程的解釋 個人覺得這個解釋很形象。 二 線程的狀態 線程狀態圖 說明:線程共包括以下5種狀態。1. 新建狀態(New) : 線 ...
  • ...
  • 回家團圓,春晚、鞭炮、春聯等都是春節的傳統代名詞,但是近兩年春節又有了一個新的代名詞,那就是“搶紅包”。今年春節期間,除了之前微信、支付寶、QQ等發紅包平臺,百度,頭條也紛紛推出了各種搶紅包活動。為了除夕夜不錯過幾個億的紅包,特意下載了一個紅包助手,用來提醒自己微信好友發紅包的信息,就這樣還是敗在了 ...
  • webservice協議 客戶端: 客戶端生成使用soapUI生成 外部提供webservice地址,地址後加?wsdl。選擇好目錄然後生成,放到項目中實現 服務端: web.xml平級目錄下創建server-config.wsdd 增加配置 <service name="目錄" provider= ...
  • 歷屆試題 列印十字圖 時間限制:1.0s 記憶體限制:256.0MB 時間限制:1.0s 記憶體限制:256.0MB 問題描述 小明為某機構設計了一個十字型的徽標(並非紅十字會啊),如下所示: ..$$$$$$$$$$$$$....$...........$..$$$.$$$$$$$$$.$$$$... ...
  • 歷屆試題 帶分數 時間限制:1.0s 記憶體限制:256.0MB 時間限制:1.0s 記憶體限制:256.0MB 問題描述 100 可以表示為帶分數的形式:100 = 3 + 69258 / 714。 還可以表示為:100 = 82 + 3546 / 197。 註意特征:帶分數中,數字1~9分別出現且只 ...
  • filter() 過濾1.結構 filter(func, iterable) ---- func函數的返回值為True,迭代iterable每個元素執行func,True則保留;False則捨去 ---- func可以使內置函數,也可以是用戶聲明的函數2.返回值 ---- fi... ...
  • 最近需要完成一個javaweb項目,但是沒有和資料庫連接而是通過websocket通訊實現和伺服器端數據交互。我搜了好多,網上大部分都是通過頁面websocket連接本地伺服器或連接異地伺服器,但是這些都把連接地址暴露在了外面,不是我想要的。本人希望websocket連接、數據處理等都是在java後 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...