Zum Fußzeileninhalt springen
IRONBARCODE VERWENDEN

MAUI Barcode-Scanner mit IronBarcode: Schritt-für-Schritt-Anleitung

Mobile Anwendungen setzen zunehmend auf Barcode-Scanning für Bestandsverwaltung, Kassensysteme und Produktverfolgung. Der Aufbau eines MAUI-Barcodescanners ermöglicht es Ihnen, die Barcode-Erkennung direkt in Ihre .NET MAUI-Anwendung zu integrieren, indem ein Kamerafeed mit der Bilddateiverarbeitung kombiniert wird, um QR-Codes, Data Matrix und andere Barcode-Formate zu erkennen. Während sich viele Bibliotheken auf die Kameravorschau konzentrieren, zeichnet sich IronBarcode durch die präzise Erfassung von Barcodes auch unter schwierigen Bedingungen aus – schräge Winkel, schlechte Beleuchtung und beschädigte Etiketten werden ohne zusätzliche Konfiguration bewältigt.

Dieser Leitfaden führt Sie durch jeden einzelnen Schritt der Implementierung des Barcode-Scannens in einem .NET MAUI Projekt mit IronBarcode. Am Ende dieses Kurses werden Sie in der Lage sein, mehrere Barcodes aus einer einzigen Bilddatei zu scannen, Barcodes mit der Kamera eines Geräts zu erfassen und die Bibliothek sicher in Ihre eigenen plattformübergreifenden Projekte zu integrieren.

Welche Voraussetzungen müssen für den Bau eines MAUI-Barcodescanners erfüllt sein?

Bevor Sie beginnen, stellen Sie sicher, dass Ihre Entwicklungsumgebung in Ordnung ist:

  • Visual Studio 2022 (Version 17.8 oder höher) mit installierter .NET MAUI Workload.
  • .NET 10 SDK -- Download von der offiziellen .NET Website
  • Grundlegende C#-Kenntnisse – Vertrautheit mit async/await-Mustern ist von Vorteil
  • Physisches Gerät oder Emulator, konfiguriert für Kameratests
  • IronBarcode -Lizenz – eine kostenlose Testversion steht zur Verfügung.

Wenn Sie sicherstellen, dass Visual Studio die MAUI-Workload installiert hat, bevor Sie Ihr Projekt erstellen, sparen Sie später viel Zeit bei der Fehlersuche. Sie können dies im Visual Studio Installer unter "Einzelne Komponenten" überprüfen, indem Sie nach ".NET Multiplattform-App-UI-Entwicklung" suchen.

Wie IronBarcode in MAUI integriert wird

.NET MAUI bietet Ihnen eine einzige Codebasis, die auf Android, iOS, macOS und Windows abzielt. Die Herausforderung beim Barcode-Scannen in dieser Umgebung besteht darin, dass jede Plattform den Kamerazugriff unterschiedlich handhabt. IronBarcode löst dieses Problem, indem es auf der Bildverarbeitungsebene arbeitet - Sie erfassen das Bild mit MAUIs MediaPicker und geben die Bytes dann zur Analyse an IronBarcode weiter.

Diese Trennung der Zuständigkeiten sorgt für sauberen Code und vermeidet plattformspezifische Barcode-SDKs. Das Offline-Verarbeitungsmodell von IronBarcode bedeutet auch, dass die Barcode-Daten das Gerät nie verlassen, was für Anwendungen in regulierten Branchen von Bedeutung ist.

Unterstützte Barcode-Formate

IronBarcode liest eine Vielzahl von Formaten , darunter:

Von IronBarcode unterstützte Barcode-Formate
Formatkategorie Formate Häufige Anwendungsfälle
1D Linear Code 128, Code 39, EAN-13, UPC-A, ITF Einzelhandel, Logistik, Gesundheitswesen
2D-Matrix QR-Code, Data Matrix, Aztec, PDF417 Mobile Zahlungen, Ticketing, Fertigung
Post USPS, Royal Mail, Deutsche Post Versand- und Postdienste
Spezialität MaxiCode, GS1, MicroPDF417 Lieferkette, Transport, Pakete

Wie richtet man ein MAUI-Barcode-Scanning-Projekt ein?

Beginnen Sie mit der Erstellung eines neuen .NET MAUI App-Projekts in Visual Studio 2022. Nennen Sie es BarcodeScannerApp und wählen Sie .NET 10 als Zielframework. Visual Studio generiert die standardmäßige MAUI-Projektstruktur mit plattformspezifischen Ordnern für Android, iOS, macOS und Windows.

IronBarcode über NuGet installieren

Öffnen Sie die NuGet Paket-Manager-Konsole und führen Sie folgenden Befehl aus:

Install-Package BarCode

Alternativ können Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt klicken, "NuGet-Pakete verwalten" wählen, nach IronBarCode suchen und die neueste stabile Version installieren. Speziell für .NET MAUI Projekte enthält das NuGet Paket von IronBarcode alle notwendigen nativen Abhängigkeiten.

Aktivierung Ihrer Lizenz

Aktivieren Sie IronBarcode nach der Installation frühzeitig im Lebenszyklus der Anwendung mit Ihrem Lizenzschlüssel. Der beste Platz ist in MauiProgram.cs, bevor der App Builder läuft:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Fordern Sie einen kostenlosen Testlizenzschlüssel auf der IronSoftware-Website an. Mit Testlizenzen können Sie während der Entwicklung alle Funktionen ohne zeitliche Einschränkungen testen. Beachten Sie jedoch, dass die Ausgabe bis zum Erwerb einer Volllizenz ein Testwasserzeichen enthalten kann.

Wie konfiguriert man Kameraberechtigungen für Android und iOS?

Plattformspezifische Kameraberechtigungen sind für die Funktionalität des Scannens von Barcodes unerlässlich. Jede Plattform erfordert eine spezifische Konfiguration in ihren Manifestdateien, bevor MediaPicker.CapturePhotoAsync() erfolgreich sein kann.

Android-Berechtigungen

Bearbeiten Sie Platforms/Android/AndroidManifest.xml, um den Kamerazugriff zu deklarieren:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
XML

Der Eintrag android.permission.CAMERA fordert die Laufzeitgenehmigung des Benutzers an. Die uses-feature-Deklarationen teilen dem Google Play Store mit, dass Ihre App Kamera-Hardware und Autofokus-Fähigkeit erfordert. Ohne diese Einstellungen können Android-Geräte zwar die Berechtigungsanfrage gewähren, den Kamerazugriff intern aber weiterhin blockieren.

Für Android 13 und höher (API-Level 33+) müssen Sie möglicherweise auch granulare Medienberechtigungen in Ihrem MainActivity.cs mit ActivityCompat.RequestPermissions behandeln. Die MAUI MediaPicker-Abstraktion erledigt das meiste davon automatisch, aber es wird empfohlen, das Gerät vor der Veröffentlichung zu testen.

iOS-Berechtigungen

Ändern Sie Platforms/iOS/Info.plist, um die Beschreibung der Kameranutzung aufzunehmen:

<key>NSCameraUsageDescription</key>
<string>This app requires camera access to scan barcodes</string>
<key>NSCameraUsageDescription</key>
<string>This app requires camera access to scan barcodes</string>
XML

iOS verlangt für jede datenschutzrelevante Berechtigung eine für Menschen verständliche Erklärung. Der Überprüfungsprozess des Apple App Stores führt zur Ablehnung Ihrer App, wenn diese Beschreibung fehlt oder unklar ist. Der Text erscheint im Dialogfeld für Systemberechtigungen, das dem Benutzer angezeigt wird, wenn die App zum ersten Mal auf die Kamera zugreift.

Für iPadOS sollten Sie auch NSPhotoLibraryUsageDescription hinzufügen, wenn Sie vorhaben, die Benutzer zusätzlich zur Live-Kamera Barcodes von gespeicherten Fotos scannen zu lassen.

Windows und macOS

Bei Windows-Desktop- und macOS-Systemen werden die Kamerazugriffsberechtigungen über die Anwendungsmanifest- bzw. Berechtigungsdateien verwaltet. Das MAUI-Framework übernimmt das meiste davon auf der Vorlagenebene, aber stellen Sie sicher, dass Package.appxmanifest unter Windows die Webcam-Fähigkeit beinhaltet.

Wie erstellt man die Benutzeroberfläche für den Barcode-Scanner?

Entwerfen Sie eine Benutzeroberfläche in MainPage.xaml, die dem Benutzer während des Scanvorgangs ein klares Feedback gibt. Ein minimalistisches, aber funktionales Layout umfasst eine Bildvorschau, einen Ergebnisanzeigebereich und eine Scan-Auslösetaste:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="BarcodeScannerApp.MainPage"
             Title="Barcode Scanner">
    <VerticalStackLayout Padding="20" Spacing="20">
        <Label Text="Point the camera at a barcode"
               FontSize="16"
               HorizontalOptions="Center"
               TextColor="#555555" />
        <Image x:Name="CapturedImage"
               HeightRequest="300"
               Aspect="AspectFit"
               BackgroundColor="#F0F0F0" />
        <Label x:Name="ResultLabel"
               Text="Tap Scan to begin"
               FontSize="18"
               HorizontalOptions="Center"
               FontAttributes="Bold" />
        <Label x:Name="FormatLabel"
               Text=""
               FontSize="13"
               HorizontalOptions="Center"
               TextColor="#888888" />
        <Button Text="Scan Barcode"
                Clicked="OnScanClicked"
                BackgroundColor="#007ACC"
                TextColor="White"
                CornerRadius="8"
                HeightRequest="50" />
        <Button Text="Load from Gallery"
                Clicked="OnPickFromGalleryClicked"
                BackgroundColor="#5C5C5C"
                TextColor="White"
                CornerRadius="8"
                HeightRequest="50" />
    </VerticalStackLayout>
</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="BarcodeScannerApp.MainPage"
             Title="Barcode Scanner">
    <VerticalStackLayout Padding="20" Spacing="20">
        <Label Text="Point the camera at a barcode"
               FontSize="16"
               HorizontalOptions="Center"
               TextColor="#555555" />
        <Image x:Name="CapturedImage"
               HeightRequest="300"
               Aspect="AspectFit"
               BackgroundColor="#F0F0F0" />
        <Label x:Name="ResultLabel"
               Text="Tap Scan to begin"
               FontSize="18"
               HorizontalOptions="Center"
               FontAttributes="Bold" />
        <Label x:Name="FormatLabel"
               Text=""
               FontSize="13"
               HorizontalOptions="Center"
               TextColor="#888888" />
        <Button Text="Scan Barcode"
                Clicked="OnScanClicked"
                BackgroundColor="#007ACC"
                TextColor="White"
                CornerRadius="8"
                HeightRequest="50" />
        <Button Text="Load from Gallery"
                Clicked="OnPickFromGalleryClicked"
                BackgroundColor="#5C5C5C"
                TextColor="White"
                CornerRadius="8"
                HeightRequest="50" />
    </VerticalStackLayout>
</ContentPage>
XML

Das Layout bietet zwei Scanpfade: Aufnehmen eines neuen Fotos mit der Kamera und Auswählen eines vorhandenen Bildes aus der Galerie. Dies ist relevant für Arbeitsabläufe, bei denen Benutzer Barcodes im Voraus fotografieren oder Bilder per E-Mail erhalten. Der FormatLabel zeigt das erkannte Barcode-Format neben dem dekodierten Wert an, was bei der Fehlersuche und der Überprüfung durch den Benutzer hilfreich ist.

Hinzufügen von Scan-Status-Feedback

Für ein optimales Ergebnis sollten Sie die Scan-Schaltflächen in ein ActivityIndicator einbinden, das während der Verarbeitung angezeigt wird. Die asynchrone API von IronBarcode macht dies ganz einfach: Sie können IsRunning = true vor dem Aufruf von BarcodeReader.ReadAsync setzen und im finally-Block zurücksetzen.

Wie implementiert man die Barcode-Lesefunktionalität?

Implementieren Sie die zentrale Scan-Logik in MainPage.xaml.cs. Der unten stehende Code übernimmt sowohl die Kameraaufnahme als auch die Galerieauswahl und verwendet dabei geeignete asynchrone Muster und eine Fehlerbehandlung:

using IronBarCode;
using IronSoftware.Drawing;

namespace BarcodeScannerApp;

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private async void OnScanClicked(object sender, EventArgs e)
    {
        await ScanFromSource(() => MediaPicker.Default.CapturePhotoAsync());
    }

    private async void OnPickFromGalleryClicked(object sender, EventArgs e)
    {
        await ScanFromSource(() => MediaPicker.Default.PickPhotoAsync());
    }

    private async Task ScanFromSource(Func<Task<FileResult?>> sourceFunc)
    {
        try
        {
            var photo = await sourceFunc();
            if (photo is null) return;

            using var stream = await photo.OpenReadAsync();
            using var memoryStream = new MemoryStream();
            await stream.CopyToAsync(memoryStream);
            var imageBytes = memoryStream.ToArray();

            // Show the captured image in the UI
            CapturedImage.Source = ImageSource.FromStream(() =>
                new MemoryStream(imageBytes));

            // Process with IronBarcode
            var bitmap = AnyBitmap.FromBytes(imageBytes);
            var options = new BarcodeReaderOptions
            {
                Speed = ReadingSpeed.Balanced,
                ExpectMultipleBarcodes = false
            };

            var results = await BarcodeReader.ReadAsync(bitmap, options);

            if (results.Any())
            {
                var first = results.First();
                ResultLabel.Text = $"Value: {first.Value}";
                FormatLabel.Text = $"Format: {first.BarcodeType}";
            }
            else
            {
                ResultLabel.Text = "No barcode detected";
                FormatLabel.Text = string.Empty;
            }
        }
        catch (FeatureNotSupportedException)
        {
            await DisplayAlert("Unsupported",
                "Camera is not available on this device.", "OK");
        }
        catch (PermissionException)
        {
            await DisplayAlert("Permission Required",
                "Please grant camera permission in Settings.", "OK");
        }
        catch (Exception ex)
        {
            await DisplayAlert("Error",
                $"Scanning failed: {ex.Message}", "OK");
        }
    }
}
using IronBarCode;
using IronSoftware.Drawing;

namespace BarcodeScannerApp;

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private async void OnScanClicked(object sender, EventArgs e)
    {
        await ScanFromSource(() => MediaPicker.Default.CapturePhotoAsync());
    }

    private async void OnPickFromGalleryClicked(object sender, EventArgs e)
    {
        await ScanFromSource(() => MediaPicker.Default.PickPhotoAsync());
    }

    private async Task ScanFromSource(Func<Task<FileResult?>> sourceFunc)
    {
        try
        {
            var photo = await sourceFunc();
            if (photo is null) return;

            using var stream = await photo.OpenReadAsync();
            using var memoryStream = new MemoryStream();
            await stream.CopyToAsync(memoryStream);
            var imageBytes = memoryStream.ToArray();

            // Show the captured image in the UI
            CapturedImage.Source = ImageSource.FromStream(() =>
                new MemoryStream(imageBytes));

            // Process with IronBarcode
            var bitmap = AnyBitmap.FromBytes(imageBytes);
            var options = new BarcodeReaderOptions
            {
                Speed = ReadingSpeed.Balanced,
                ExpectMultipleBarcodes = false
            };

            var results = await BarcodeReader.ReadAsync(bitmap, options);

            if (results.Any())
            {
                var first = results.First();
                ResultLabel.Text = $"Value: {first.Value}";
                FormatLabel.Text = $"Format: {first.BarcodeType}";
            }
            else
            {
                ResultLabel.Text = "No barcode detected";
                FormatLabel.Text = string.Empty;
            }
        }
        catch (FeatureNotSupportedException)
        {
            await DisplayAlert("Unsupported",
                "Camera is not available on this device.", "OK");
        }
        catch (PermissionException)
        {
            await DisplayAlert("Permission Required",
                "Please grant camera permission in Settings.", "OK");
        }
        catch (Exception ex)
        {
            await DisplayAlert("Error",
                $"Scanning failed: {ex.Message}", "OK");
        }
    }
}
Imports IronBarCode
Imports IronSoftware.Drawing

Namespace BarcodeScannerApp

    Public Partial Class MainPage
        Inherits ContentPage

        Public Sub New()
            InitializeComponent()
        End Sub

        Private Async Sub OnScanClicked(sender As Object, e As EventArgs)
            Await ScanFromSource(Function() MediaPicker.Default.CapturePhotoAsync())
        End Sub

        Private Async Sub OnPickFromGalleryClicked(sender As Object, e As EventArgs)
            Await ScanFromSource(Function() MediaPicker.Default.PickPhotoAsync())
        End Sub

        Private Async Function ScanFromSource(sourceFunc As Func(Of Task(Of FileResult?))) As Task
            Try
                Dim photo = Await sourceFunc()
                If photo Is Nothing Then Return

                Using stream = Await photo.OpenReadAsync()
                    Using memoryStream = New MemoryStream()
                        Await stream.CopyToAsync(memoryStream)
                        Dim imageBytes = memoryStream.ToArray()

                        ' Show the captured image in the UI
                        CapturedImage.Source = ImageSource.FromStream(Function() New MemoryStream(imageBytes))

                        ' Process with IronBarcode
                        Dim bitmap = AnyBitmap.FromBytes(imageBytes)
                        Dim options = New BarcodeReaderOptions With {
                            .Speed = ReadingSpeed.Balanced,
                            .ExpectMultipleBarcodes = False
                        }

                        Dim results = Await BarcodeReader.ReadAsync(bitmap, options)

                        If results.Any() Then
                            Dim first = results.First()
                            ResultLabel.Text = $"Value: {first.Value}"
                            FormatLabel.Text = $"Format: {first.BarcodeType}"
                        Else
                            ResultLabel.Text = "No barcode detected"
                            FormatLabel.Text = String.Empty
                        End If
                    End Using
                End Using
            Catch ex As FeatureNotSupportedException
                Await DisplayAlert("Unsupported", "Camera is not available on this device.", "OK")
            Catch ex As PermissionException
                Await DisplayAlert("Permission Required", "Please grant camera permission in Settings.", "OK")
            Catch ex As Exception
                Await DisplayAlert("Error", $"Scanning failed: {ex.Message}", "OK")
            End Try
        End Function
    End Class

End Namespace
$vbLabelText   $csharpLabel

Diese Implementierung verwendet eine gemeinsame ScanFromSource Helper-Methode, um eine Duplizierung der Bildverarbeitungslogik zwischen den Kamera- und Galeriepfaden zu vermeiden. Die AnyBitmap.FromBytes-Methode verarbeitet JPEG, PNG, WebP und andere gängige Bildformate automatisch - eine manuelle Formaterkennung ist nicht erforderlich.

Das Ergebnisobjekt stellt neben anderen Eigenschaften first.Value (die dekodierte Zeichenkette), first.BarcodeType (das Format-Enum) und first.BarcodeImage (ein beschnittenes Bild des erkannten Barcodebereichs) zur Verfügung. Die vollständige Liste finden Sie in der Dokumentation der BarcodeResult-Klasse .

Testen Ihrer Scan-Implementierung

Nachdem der Code implementiert ist, können Sie ihn mit einem Standard-Barcode testen:

Wie man einen MAUI-Barcodescanner mit IronBarcode erstellt: Abbildung 2 - Eingabetest-Barcode

Nach dem Scannen wird der dekodierte Wert auf dem Bildschirm angezeigt:

Wie man einen MAUI-Barcodescanner mit IronBarcode erstellt: Abbildung 3 - Gescannter Barcode-Wert

Wie konfiguriert man die erweiterten Scanoptionen?

IronBarcode stellt ein BarcodeReaderOptions-Objekt zur Verfügung, mit dem Sie das Erkennungsverhalten für Ihren speziellen Anwendungsfall feinabstimmen können. Das Verständnis dieser Optionen hilft Ihnen, Geschwindigkeit und Genauigkeit je nach den Anforderungen Ihrer Anwendung in Einklang zu bringen.

Gezielte Ausrichtung auf bestimmte Barcode-Typen

Die Angabe der exakten Barcode-Typen, die Sie erwarten, reduziert die Verarbeitungszeit erheblich, da IronBarcode unnötige Formatprüfungen überspringt:

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};

var results = await BarcodeReader.ReadAsync(bitmap, options);
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};

var results = await BarcodeReader.ReadAsync(bitmap, options);
Imports System.Threading.Tasks

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128
}

Dim results = Await BarcodeReader.ReadAsync(bitmap, options)
$vbLabelText   $csharpLabel

Wie man mit IronBarcode einen MAUI Barcode Scanner erstellt: Abbildung 4 - Mehrere Codes von einem Bild gescannt

Die Einstellung ExpectMultipleBarcodes = true weist IronBarcode an, nach dem ersten Ergebnis weiter zu scannen, was für Lagerarbeitsabläufe wichtig ist, bei denen ein einziger Packzettel ein Dutzend Barcodes enthalten kann.

Optionen für die Lesegeschwindigkeit

Die Aufzählung ReadingSpeed bietet vier Stufen: ExtremeDetail, Detailed, Balanced, und QuickScan. Verwenden Sie QuickScan für hochvolumige Szenarien, in denen Barcodes sauber und gut beleuchtet sind. Wechseln Sie zu Detailed oder ExtremeDetail, wenn Sie von niedrig aufgelösten Kameraaufnahmen oder teilweise beschädigten Etiketten scannen.

Weitere Informationen zum Einstellen von BarcodeReaderOptions , einschließlich Bildkorrekturfiltern und Konfidenzschwellenwerten, finden Sie in der Dokumentation mit detaillierten Beispielen.

Bildkorrektur und Vorverarbeitung

IronBarcode beinhaltet eine integrierte Bildkorrektur, die automatisch mit gedrehten, verzerrten oder schlecht beleuchteten Barcodes umgeht. Sie können auch manuell Vorverarbeitungsfilter über BarcodeReaderOptions.ImageFilters anwenden:

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Detailed,
    ImageFilters = new ImageFilterCollection
    {
        new SharpenFilter(),
        new ContrastFilter(1.2f)
    }
};
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Detailed,
    ImageFilters = new ImageFilterCollection
    {
        new SharpenFilter(),
        new ContrastFilter(1.2f)
    }
};
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Detailed,
    .ImageFilters = New ImageFilterCollection From {
        New SharpenFilter(),
        New ContrastFilter(1.2F)
    }
}
$vbLabelText   $csharpLabel

Vorverarbeitungsfilter sind besonders nützlich, wenn die Anwendung auf ältere Android-Geräte mit Kamerasensoren geringerer Qualität abzielt oder wenn Benutzer Barcodes wahrscheinlich unter suboptimalen Lichtverhältnissen wie in Lagerhallen oder im Freien fotografieren werden.

Wie gehen Sie mit häufig auftretenden Fehlersuchszenarien um?

Selbst bei einem gut konfigurierten MAUI-Barcodescanner können Probleme durch gerätespezifisches Verhalten, Bildqualitätsprobleme oder Plattformbeschränkungen auftreten.

Kamera öffnet nicht

Wenn die Kamera nicht startet, überprüfen Sie, ob die Berechtigungen sowohl in AndroidManifest.xml als auch in Info.plist korrekt deklariert sind. Stellen Sie die App anschließend mit einem sauberen Build neu bereit, anstatt einen Hot Reload durchzuführen. Prüfen Sie bei Android auch, ob Ihr Testgerät eine nicht standardmäßige Kamerakonfiguration verwendet – bei einigen Geräten mit mehreren Kameras ist eine explizite Objektivauswahl erforderlich.

Auf dem Simulator wird MediaPicker.CapturePhotoAsync() nicht unterstützt. Testen Sie die Kamerafunktionen immer auf einem physischen Gerät. Der Emulator unterstützt PickPhotoAsync für die Galerieauswahl, die Sie für grundlegende UI-Tests mit vorgeladenen Bildern verwenden können.

Mangelhafte Scangenauigkeit

Falls IronBarcode keine Ergebnisse oder falsche Werte liefert, versuchen Sie folgende Anpassungen:

  • Erhöhen Sie den Speed auf ReadingSpeed.Detailed oder ExtremeDetail
  • Hinzufügen von SharpenFilter und ContrastFilter in die Bildfilter-Pipeline
  • Stellen Sie sicher, dass die Auflösung des aufgenommenen Bildes mindestens 720p beträgt; niedrigere Auflösungen führen bei dichten Formaten wie Data Matrix zu Fehldetektionen.
  • Prüfen Sie, ob der BarCode-Typ in Ihrer ExpectBarcodeTypes Maske enthalten ist

Der IronBarcode Leitfaden zur Fehlerbehebung enthält zusätzliche Diagnoseschritte für formatspezifische Probleme.

Debugging-Tipps

Große Kamerabilder verbrauchen viel Speicher, wenn sie in MemoryStream geladen werden. Verwenden Sie immer using-Anweisungen für alle Stream-Objekte, um die Entsorgung sicherzustellen. Für kontinuierliche Scan-Workflows, bei denen Benutzer mehrere Elemente nacheinander scannen, rufen Sie bitmap.Dispose() auch explizit nach der Verarbeitung auf, anstatt auf den Garbage Collector zu warten.

Bei Android-Geräten mit begrenztem Heap-Speicherplatz sollten Sie erwägen, das Bild vor der Übergabe an IronBarcode herunterzuskalieren, wenn es sich bei den Scans um saubere, kontrastreiche Barcodes handelt, die für eine genaue Dekodierung keine volle Auflösung benötigen.

Plattformspezifisches iOS-Verhalten

Unter iOS wird beim ersten Mal, wenn Ihre App die Kameraberechtigung anfordert, ein einmaliger Dialog angezeigt. Wenn der Benutzer dies verweigert, wird bei nachfolgenden Aufrufen von CapturePhotoAsync ein PermissionException ausgegeben. In diesem Fall sollten Sie den Benutzer zu den Einstellungen leiten, was Sie mit AppInfo.ShowSettingsUI() tun können.

Bestätigen Sie, dass NSCameraUsageDescription in Info.plist vorhanden ist, bevor Sie den Text im App Store einreichen. Fehlende Datenschutzhinweise führen ohne detaillierte Begründung seitens des Prüfteams zur automatischen Ablehnung. Beachten Sie die Apple Human Interface Guidelines für den Kamerazugriff, um Best Practices für den Zeitpunkt und die Formulierung von Berechtigungsanfragen zu erhalten.

Was sind Ihre nächsten Schritte?

Nachdem Sie nun einen funktionierenden MAUI-Barcodescanner mit IronBarcode besitzen, stehen Ihnen je nach den Anforderungen Ihrer Anwendung verschiedene Wege offen:

  • Barcodes generieren – IronBarcode enthält eine API zur Barcode-Generierung , mit der QR-Codes, Code-128-Etiketten und andere Formate aus Zeichenkettendaten erstellt werden können.
  • Batch-Scanning - Verarbeiten Sie mehrere Bilddateien in einer Schleife mit BarcodeReader.ReadAsync mit ExpectMultipleBarcodes = true; Siehe die Beispiele für Stapelverarbeitung.
  • PDF-Barcode-Extraktion -- IronBarcode kann Barcodes lesen, die in PDF-Dokumente eingebettet sind und dieselbe BarcodeReader Klasse verwenden; Erkunden Sie die PDF-Dokumentation zum Barcode-Lesen.
  • Styling und Branding – die visuelle Darstellung der generierten Barcodes mit Farben, Logos und Anmerkungen anpassen; Barcode-Styling-Optionen anzeigen
  • Weitere IronSoftware-Produkte – falls Ihre MAUI-App auch PDF-Generierung, OCR oder Tabellenkalkulationsunterstützung benötigt, erkunden Sie die vollständige Iron Suite für konsistente plattformübergreifende Funktionen.

Beginnen Sie mit einer kostenlosen Testlizenz, um das System während Ihrer Testphase ohne Einschränkungen nutzen zu können. Informationen zu Produktionslizenzoptionen und Mengenrabatten finden Sie auf der IronBarcode Preisseite . Das IronBarcode Dokumentationsportal und das IronBarcode GitHub Repository bieten zusätzliche Codebeispiele und Community-Support.

Häufig gestellte Fragen

Was ist der Vorteil von IronBarcode für einen MAUI-Barcodescanner?

IronBarcode verarbeitet Barcodes auf der Bildebene, arbeitet offline, unterstützt über 30 Formate und bewältigt schwierige Bedingungen wie schräge Winkel und schlechte Lichtverhältnisse ohne zusätzliche Konfiguration.

Kann IronBarcode mehrere Barcodes in einem Bild erkennen?

Ja. Setzen Sie `ExpectMultipleBarcodes = true` in `BarcodeReaderOptions` und rufen Sie `BarcodeReader.ReadAsync` auf. IronBarcode gibt dann alle erkannten Barcodes in der Ergebnisliste zurück.

Wie konfiguriere ich die Kameraberechtigungen für Android und iOS in MAUI?

Fügen Sie für Android die Elemente `uses-permission` und `uses-feature` der Klasse `CAMERA` zur Datei `AndroidManifest.xml` hinzu. Fügen Sie für iOS die Klasse `NSCameraUsageDescription` mit einer verständlichen Beschreibung zur Datei `Info.plist` hinzu.

Unterstützt IronBarcode das Scannen von Barcodes im Offline-Modus?

Ja. IronBarcode verarbeitet Bilder vollständig auf dem Gerät, ohne Daten an externe Server zu senden, was für datenschutzsensible Anwendungen wichtig ist.

Welche Barcode-Formate unterstützt IronBarcode in MAUI?

IronBarcode unterstützt QR-Code, Code 128, Code 39, EAN-13, UPC-A, Data Matrix, PDF417, Aztec, MaxiCode und viele weitere Formate. Über BarcodeEncoding-Flags können Sie gezielt bestimmte Formate ansprechen.

Wie kann ich die Scangenauigkeit bei Bildern mit geringer Qualität verbessern?

Stellen Sie die Lesegeschwindigkeit auf „Detailliert“ oder „Extremdetail“ ein, fügen Sie den Bildfiltern „SchärfenFilter“ und „KontrastFilter“ hinzu und stellen Sie sicher, dass das aufgenommene Bild mindestens eine Auflösung von 720p hat.

Kann IronBarcode Barcodes aus PDF-Dateien in einer MAUI-App lesen?

Ja. Die BarcodeReader-Klasse von IronBarcode kann Barcodes, die in PDF-Dokumenten eingebettet sind, mithilfe derselben ReadAsync-API extrahieren, die auch für Bilddateien verwendet wird.

Wie behandle ich eine PermissionException, wenn der Kamerazugriff verweigert wird?

Fangen Sie eine PermissionException in einem try/catch-Block ab und rufen Sie AppInfo.ShowSettingsUI() auf, um den Benutzer zu den Geräteeinstellungen zu leiten, wo er den Kamerazugriff wieder aktivieren kann.

Jordi Bardia
Software Ingenieur
Jordi ist am besten in Python, C# und C++ versiert. Wenn er nicht bei Iron Software seine Fähigkeiten einsetzt, programmiert er Spiele. Mit Verantwortung für Produkttests, Produktentwicklung und -forschung trägt Jordi mit immensem Wert zur kontinuierlichen Produktverbesserung bei. Die abwechslungsreiche Erfahrung hält ihn gefordert und engagiert, ...
Weiterlesen

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an