Barcode scanning library for .NET MAUI
$ dotnet add package BarcodeScanning.Native.MauiBarcode scanning library based on native platform APIs for barcode detection:
This library was inspired by existing MAUI barcode scanning libraries: BarcodeScanner.Mobile & Zxing.Net.MAUI, but comes with many code improvements and uses native ML APIs on both Android and iOS/macOS.
ViewfinderMode - detect only barcodes present in camera preview on screen and AimMode - detect only the barcode that is overlapped with the red dot centred in camera preview,MauiProgram.cs:
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
...
.UseBarcodeScanning();
...
return builder.Build();
}
AndroidManifest.xml file (under the Platforms\Android folder) and add the following permissions inside of the manifest node:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
info.plist file (under the Platforms\iOS or Platforms\MacCatalyst folder) and add the following permissions inside of the dict node:
<key>NSCameraUsageDescription</key>
<string>Enable camera for barcode scanning.</string>
And ask for permission from user in your code:
await Methods.AskForRequiredPermissionAsync();
xmlns:scanner="clr-namespace:BarcodeScanning;assembly=BarcodeScanning.Native.Maui"
CameraEnabled property to true in XAML, code behind or ViewModel to start the camera. As a best practice set it in OnAppearing() method override in your ContentPage.OnDetectionFinished event in Code-behind:
<scanner:CameraView ...
OnDetectionFinished="CameraView_OnDetectionFinished"
.../>
private void CameraView_OnDetectionFinished(object sender, OnDetectionFinishedEventArg e)
{
if (e.BarcodeResults.Count > 0)
...
}
or bind OnDetectionFinishedCommand property to a Command in your ViewModel:
<scanner:CameraView ...
OnDetectionFinishedCommand="{Binding DetectionFinishedCommand}"
.../>
public ICommand DetectionFinishedCommand { get; set; }
...
DetectionFinishedCommand = new Command<IReadOnlySet<BarcodeResult>>(IReadOnlySet<BarcodeResult> result) =>
{
if (result.Count > 0)
...
}
CameraEnabled property to false in OnDisappearing() method override in your ContentPage.DisconnectHandler() is no loger required, but optional. More info here: What's new in .NET MAUI for .NET 9CaptureNextFrame property to true to capture next frame from the camera feed as a PlatformImage. Listen to OnImageCaptured event or bind to OnImageCapturedCommand property to get the caputured image. Image is captured from the original camera feed and can be different from the on-screen preview. After the image is captured CaptureNextFrame property is automaticly set to false to prevent memory leaks. Example can be found in ScanTab.xaml.cs.byte[], FileResult, string, or Stream using the methods available in the Methods class.1D: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E; 2D: Aztec, Data Matrix, PDF417, QR Code
1D: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, GS1 DataBar, ITF, UPC-A, UPC-E; 2D: Aztec, Data Matrix, MicroPDF417, MicroQR, PDF417, QR Code
1D: Codabar, Code 39, PZN, Code 93, Code 128, EAN-8, EAN-5, EAN-2, EAN-13, EAN/UPC, ITF, ITF-14, UPC-A, UPC-E, ISBN, DataBar, DataBar Omni, DataBar Stacked, DataBar Stacked Omni, DataBar Limited, DataBar Expanded, DataBar Expanded Stacked, DX Film Edge; 2D: Aztec, Aztec Code, Aztec Rune, Data Matrix, PDF417, Compact PDF417, Micro PDF417, QR Code, QR Code Model 1, QR Code Model 2, MicroQR, rMQR, MaxiCode
A list of bindable properties with descriptions can be found in CameraView.cs source file.