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 viele Bibliotheken sich auf die Kameravorschau konzentrieren, zeichnet sich IronBarcode dadurch aus, Barcodes auch unter schwierigen Bedingungen genau zu lesen -- schräg gestellte Winkel, schlechte Beleuchtung und beschädigte Etiketten werden ohne zusätzliche Konfiguration gehandhabt.

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 adressiert dies, indem es auf der Ebene der Bildverarbeitung arbeitet -- Sie erfassen das Bild über MAUI's MediaPicker und übergeben dann die Bytes zur Analyse an IronBarcode.

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 Ziel-Framework aus. 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 klicken Sie mit der rechten Maustaste auf Ihr Projekt im Solution Explorer, wählen "Manage NuGet Packages", suchen nach IronBarCode und installieren die neueste stabile Version. Speziell for .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 Ort ist in MauiProgram.cs, bevor der App-Builder ausgeführt wird:

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

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

Holen Sie sich einen kostenlosen Testlizenzschlüssel von der Iron Software-Website. Testschlüssel erlauben Ihnen, alle Funktionen ohne Zeitbeschränkungen während der Entwicklung zu evaluieren, obwohl die Ausgabe möglicherweise ein Testwasserzeichen enthält, bis Sie eine vollständige Lizenz anwenden.

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 Manifest-Dateien, bevor MediaPicker.CapturePhotoAsync() erfolgreich sein wird.

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 android.permission.CAMERA Eintrag fordert die Laufzeitberechtigung vom Benutzer an. Die uses-feature Deklarationen informieren den Google Play Store, dass Ihre App Kamerahardware und Autofokus-Fähigkeiten benötigt. 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-Stufe 33+) müssen Sie möglicherweise auch granulare Medienberechtigungen in Ihrer MainActivity.cs mit ActivityCompat.RequestPermissions verwalten. Die MAUI MediaPicker Abstraktion erledigt den größten Teil dieser Aufgaben automatisch, aber ein Testen auf physischen Geräten wird vor der Freigabe empfohlen.

iOS-Berechtigungen

Modifizieren Sie Platforms/iOS/Info.plist, um die Kameranutzungsbeschreibung einzuschließen:

<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 das Hinzufügen von NSPhotoLibraryUsageDescription erwägen, wenn Sie planen, Benutzern das Scannen von Barcodes aus gespeicherten Fotos zusätzlich zur Live-Kamera zu ermöglichen.

Windows und macOS

Bei Windows-Desktop- und macOS-Systemen werden die Kamerazugriffsberechtigungen über die Anwendungsmanifest- bzw. Berechtigungsdateien verwaltet. Das MAUI-Framework erledigt die meisten dieser Aufgaben auf Templateniveau, aber überprüfen Sie, dass Package.appxmanifest unter Windows die Webcam-Gerätefähigkeit beinhaltet.

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

Gestalten Sie eine Benutzeroberfläche in MainPage.xaml, die den Benutzern während des Scanvorgangs klare Rückmeldungen 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. Die FormatLabel zeigt das erkannte Barcode-Format zusammen mit dem decodierten Wert an, was beim Debuggen und bei der Benutzerverifizierung hilfreich ist.

Hinzufügen von Scan-Status-Feedback

Für ein professionelles Erscheinungsbild ziehen Sie in Betracht, die Scan-Schaltflächen in einen ActivityIndicator zu packen, der während der Verarbeitung angezeigt wird. Die asynchrone API von IronBarcode macht dies einfach -- Sie können IsRunning = true einstellen, bevor Sie BarcodeReader.ReadAsync aufrufen, und es im finally-Block zurücksetzen.

Wie implementiert man die Barcode-Lesefunktionalität?

Implementieren Sie die zentrale Scanlogik 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 Hilfsmethode, um die Bildverarbeitungslogik zwischen Kamera- und Galeriewegen nicht zu duplizieren. Die AnyBitmap.FromBytes Methode verarbeitet JPEG, PNG, WebP und andere gängige Bildformate automatisch -- keine manuelle Formaterkennung erforderlich.

Das Ergebnisobjekt bietet first.Value (den decodierten String), first.BarcodeType (das Format-Enum) und first.BarcodeImage (ein zugeschnittenes Bild des erkannten Barcodes) unter anderem Eigenschaften. 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:

So erstellen Sie einen MAUI-Barcode-Scanner mit IronBarcode: Abbildung 2 - Testbarcodeeingabe

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

So erstellen Sie einen MAUI-Barcode-Scanner mit IronBarcode: 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 spezifischen 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

So erstellen Sie einen MAUI-Barcode-Scanner mit IronBarcode: Abbildung 4 - Mehrere Codes, gescannt von demselben Bild

Die Einstellung von ExpectMultipleBarcodes = true weist IronBarcode an, nach dem ersten Ergebnis weiterhin zu scannen, was für Arbeitsabläufe im Lagerhaus entscheidend ist, bei denen ein einzelner Lieferschein ein Dutzend Barcodes enthalten kann.

Optionen für die Lesegeschwindigkeit

Das ReadingSpeed Enum bietet vier Stufen: ExtremeDetail, Detailed, Balanced und QuickScan. Verwenden Sie QuickScan für Szenarien mit hohem Volumen, in denen Barcodes sauber und gut beleuchtet sind. Wechseln Sie zu Detailed oder ExtremeDetail, wenn Sie von Low-Resolution-Kameraufnahmen oder teils 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 durch 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 immer Kamera-Funktionen auf einem physischen Gerät. Der Emulator unterstützt PickPhotoAsync für die Galerieauswahl, das Sie für grundlegende UI-Tests mit vorinstallierten Bildern verwenden können.

Mangelhafte Scangenauigkeit

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

  • Erhöhen Sie Speed auf ReadingSpeed.Detailed oder ExtremeDetail
  • Fügen Sie SharpenFilter und ContrastFilter zur Bildfilter-Pipeline hinzu
  • 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.
  • Überprü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 Kamera-Bilder verbrauchen erheblich Speicher, wenn sie in MemoryStream geladen werden. Verwenden Sie immer using Anweisungen auf allen Stream-Objekten zur Sicherstellung der Freigabe. Für kontinuierliche Scan-Abläufe, bei denen Benutzer mehrere Artikel der Reihe nach scannen, rufen Sie auch bitmap.Dispose() 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 ablehnt, werden nachfolgende Aufrufe von CapturePhotoAsync eine PermissionException auslösen. Behandeln Sie diesen Fall, indem 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 es an den App Store übermitteln. 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 und ExpectMultipleBarcodes = true; siehe Stapel-Scan-Beispiele
  • PDF Barcode Extraction -- IronBarcode kann Barcodes, die in PDF-Dokumenten eingebettet sind, unter Verwendung der gleichen BarcodeReader Klasse lesen; 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
  • Andere Iron Software-Produkte -- Wenn Ihre MAUI-App auch PDF-Erstellung, OCR oder Tabellenkalkulationsunterstützung benötigt, erkunden Sie die komplette Iron Suite für konsistente plattformübergreifende Fähigkeiten

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.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

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