Przejdź do treści stopki
KORZYSTANIE Z IRONBARCODE

Skaner kodów kreskowych MAUI z IronBarcode: Przewodnik krok po kroku

Aplikacje mobilne w coraz większym stopniu wykorzystują skanowanie BarCode do zarządzania zapasami, obsługi systemów kasowych oraz śledzenia produktów. Stworzenie skanera kodów kreskowych MAUI pozwala na bezpośrednią integrację funkcji wykrywania kodów kreskowych z aplikacją .NET MAUI, łącząc obraz z kamery z przetwarzaniem plików graficznych w celu wykrywania kodów QR, Data Matrix i innych formatów kodów kreskowych. Podczas gdy wiele bibliotek skupia się na podglądzie z kamery, IronBarcode wyróżnia się dokładnym odczytywaniem kodów kreskowych nawet w trudnych warunkach — pochylone kąty, słabe oświetlenie i uszkodzone etykiety są obsługiwane bez dodatkowej konfiguracji.

Ten przewodnik przeprowadza użytkownika przez wszystkie etapy wdrażania skanowania kodów kreskowych w projekcie .NET MAUI przy użyciu IronBarcode. Po zakończeniu będziesz w stanie skanować wiele kodów kreskowych z jednego pliku graficznego, przechwytywać kody kreskowe z aparatu urządzenia oraz z pewnością siebie zintegrować bibliotekę z własnymi projektami wielopłatformowymi.

Jakie są wymagania wstępne dotyczące stworzenia skanera BarCode MAUI?

Przed rozpoczęciem upewnij się, że Twoje środowisko programistyczne jest w porządku:

  • Visual Studio 2022 (wersja 17.8 lub nowsza) z zainstalowanym środowiskiem .NET MAUI
  • .NET 10 SDK — pobierz z oficjalnej strony .NET
  • Podstawowa znajomość języka C# — pomocna będzie znajomość wzorców async/await
  • Urządzenie fizyczne lub emulator skonfigurowany do testowania aparatu
  • Licencja IronBarcode — dostępna jest bezpłatna wersja próbna do oceny

Upewnienie się, że w Visual Studio zainstalowano środowisko MAUI przed utworzeniem projektu, pozwala zaoszczędzić sporo czasu na rozwiązywaniu problemów w przyszłości. Można to sprawdzić w Visual Studio Installer w sekcji "Poszczególne komponenty", wyszukując hasło ".NET Multi-platform App UI development".

Zrozumienie, jak IronBarcode wpisuje się w MAUI

.NET MAUI zapewnia jedną bazę kodu przeznaczoną dla systemów Android, iOS, macOS i Windows. Wyzwaniem związanym ze skanowaniem kodów kreskowych w tym środowisku jest to, że każda platforma inaczej obsługuje dostęp do kamery. IronBarcode rozwiązuje ten problem, działając na poziomie przetwarzania obrazu — obraz jest przechwytywany za pomocą MediaPicker w MAUI, a następnie bajty są przekazywane do IronBarcode w celu analizy.

Takie rozdzielenie zadań pozwala zachować przejrzystość kodu i uniknąć korzystania z platformowych zestawów SDK do obsługi kodów barcode. Model przetwarzania offline IronBarcode oznacza również, że dane kodów kreskowych nigdy nie opuszczają urządzenia, co ma znaczenie w przypadku aplikacji w branżach podlegających regulacjom.

Obsługiwane formaty BarCode

IronBarcode odczytuje szeroki zakres formatów, w tym:

Formaty BarCode obsługiwane przez IronBarcode
Kategoria formatu Formaty Typowe przypadki użycia
1D Liniowy Code 128, Code 39, EAN-13, UPC-A, ITF Handel detaliczny, logistyka, opieka zdrowotna
Macierz 2D QR Code, Data Matrix, Aztec, PDF417 Płatności mobilne, sprzedaż biletów, produkcja
Poczta USPS, Royal Mail, Deutsche Post Usługi wysyłkowe i pocztowe
Specjalizacja MaxiCode, GS1, MicroPDF417 Łańcuch dostaw, transport, paczki

Jak skonfigurować projekt skanowania BarCode w MAUI?

Zacznij od utworzenia nowego projektu aplikacji .NET MAUI w programie Visual Studio 2022. Nazwij go BarcodeScannerApp i wybierz .NET Framework 10 jako docelową platformę. Visual Studio generuje standardową strukturę projektu MAUI z folderami specyficznymi dla platformy dla systemów Android, iOS, macOS i Windows.

Instalacja IronBarcode za pośrednictwem NuGet

Otwórz konsolę NuGet Package Manager Console i uruchom:

Install-Package BarCode

Alternatywnie, kliknij prawym przyciskiem myszy swój projekt w Solution Explorer, wybierz "Zarządzaj pakietami NuGet", wyszukaj IronBarCode i zainstaluj najnowszą stabilną wersję. W przypadku projektów .NET MAUI pakiet NuGet firmy IronBarcode zawiera wszystkie niezbędne zależności natywne.

Aktywacja licencji

Po instalacji należy aktywować IronBarcode za pomocą klucza licencyjnego na wczesnym etapie cyklu życia aplikacji. Najlepszym miejscem jest MauiProgram.cs przed uruchomieniem narzędzia Builder:

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

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

Pobierz bezpłatną licencję probną ze strony internetowej IronSoftware. Licencje Trial pozwalają na ocenę wszystkich funkcji bez ograniczeń czasowych podczas tworzenia oprogramowania, jednak wyniki mogą zawierać znak wodny wersji próbnej do momentu aktywacji pełnej licencji.

Jak skonfigurować uprawnienia aparatu w systemach Android i iOS?

Uprawnienia kamery specyficzne dla platformy są niezbędne do działania funkcji skanowania kodów barcode. Każda platforma wymaga określonej konfiguracji w plikach manifestu, aby MediaPicker.CapturePhotoAsync() działało poprawnie.

Uprawnienia w systemie Android

Edytuj Platforms/Android/AndroidManifest.xml, aby zadeklarować dostęp do kamery:

<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

Wpis android.permission.CAMERA prosi użytkownika o pozwolenie na uruchomienie. Deklaracje uses-feature informują sklep Google Play, że Twoja aplikacja wymaga sprzętu aparatu fotograficznego i funkcji autofokusa. Bez nich urządzenia z systemem Android mogą przyznać uprawnienie, ale nadal blokować dostęp do aparatu wewnętrznie.

W przypadku systemu Android 13 i nowszych (poziom API 33+) może być również konieczne obsłużenie szczegółowych uprawnień dotyczących multimediów w MainActivity.cs przy użyciu ActivityCompat.RequestPermissions. Abstrakcja MAUI MediaPicker automatycznie zajmuje się większością tych zadań, ale przed wydaniem zaleca się przeprowadzenie testów na fizycznych urządzeniach.

Uprawnienia w systemie iOS

Zmodyfikuj Platforms/iOS/Info.plist, aby uwzględnić opis użycia kamery:

<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

System iOS wymaga zrozumiałego dla użytkownika wyjaśnienia każdego uprawnienia związanego z prywatnością. Proces weryfikacji w App Store firmy Apple spowoduje odrzucenie aplikacji, jeśli ten opis będzie brakował lub będzie niejasny. Tekst pojawia się w oknie dialogowym uprawnień systemówych wyświetlanym użytkownikowi przy pierwszym żądaniu dostępu do aparatu przez aplikację.

W przypadku iPadOS rozważ również dodanie NSPhotoLibraryUsageDescription, jeśli planujesz umożliwić użytkownikom skanowanie BARCODE-ów z zapisanych zdjęć, oprócz korzystania z aparatu na żywo.

Windows i macOS

W przypadku systemów Windows Desktop i macOS uprawnienia dostępu do kamery są zarządzane odpowiednio za pomocą pliku manifestu aplikacji i plików uprawnień. Framework MAUI obsługuje większość tych zadań na poziomie szablonów, ale należy sprawdzić, czy Package.appxmanifest w systemie Windows obsługuje funkcję kamery internetowej.

Jak stworzyć interfejs skanera BarCode?

Zaprojektuj interfejs użytkownika w MainPage.xaml, który zapewni użytkownikom jasne informacje zwrotne podczas procesu skanowania. Minimalny, ale funkcjonalny układ zawiera podgląd obrazu, obszar wyświetlania wyników oraz przycisk uruchamiający skanowanie:

<?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

Układ oferuje dwie ścieżki skanowania: zrobienie nowego zdjęcia aparatem oraz wybranie istniejącego obrazu z galerii. Ma to znaczenie w przypadku procesów, w których użytkownicy wcześniej fotografują BarCodes lub otrzymują obrazy pocztą elektroniczną. FormatLabel wyświetla wykryty format BARCODE wraz z odkodowaną wartością, co pomaga podczas debugowania i weryfikacji przez użytkownika.

Dodawanie informacji zwrotnej o stanie skanowania

Aby zapewnić płynne działanie, warto rozważyć umieszczenie przycisków skanowania w tagu ActivityIndicator, który będzie wyświetlany podczas przetwarzania. Asynchroniczny interfejs API IronBarcode sprawia, że jest to proste — można ustawić IsRunning = true przed wywołaniem BarcodeReader.ReadAsync i zresetować go w bloku finally.

Jak wdrożyć funkcję czytnika BarCode?

Zaimplementuj podstawową logikę skanowania w MainPage.xaml.cs. Poniższy kod obsługuje zarówno przechwytywanie obrazu z kamery, jak i wybór zdjęć z galerii, z wykorzystaniem odpowiednich wzorców asynchronicznych i obsługi błędów:

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

W tej implementacji wykorzystano wspólną metodę pomocniczą ScanFromSource, aby uniknąć powielania logiki przetwarzania obrazu między ścieżkami kamery i galerii. Metoda AnyBitmap.FromBytes automatycznie obsługuje formaty JPEG, PNG, WebP i inne popularne formaty obrazów — nie jest wymagańe ręczne wykrywanie formatu.

Obiekt wynikowy udostępnia między innymi first.Value (zdekodowany ciąg znaków), first.BarcodeType (wyliczenie formatów) oraz first.BarcodeImage (przycięty obraz wykrytego obszaru BARCODE). Pełną listę można znaleźć w dokumentacji klasy BarcodeResult.

Testowanie implementacji skanowania

Po wdrożeniu kodu można przetestować go na standardowym BARCODE-ie:

Jak stworzyć skaner kodów kreskowych MAUI przy użyciu IronBarcode: Rysunek 2 – Testowy kod kreskowy do wprowadzenia

Po zeskanowaniu na ekranie pojawia się zdekodowana wartość:

Jak stworzyć skaner kodów kreskowych MAUI przy użyciu IronBarcode: Rysunek 3 – Wartość zeskanowanego kodu kreskowego

Jak skonfigurować zaawansowane opcje skanowania?

IronBarcode udostępnia obiekt BarcodeReaderOptions, który pozwala precyzyjnie dostosować zachowanie wykrywania do konkretnego przypadku użycia. Zrozumienie tych opcji pomoże Ci znaleźć równowagę między szybkością a dokładnością w zależności od potrzeb Twojej aplikacji.

Kierowanie na konkretne typy BarCodes

Określenie dokładnych typów kodów kreskowych, których oczekujesz, znacznie skraca czas przetwarzania, ponieważ IronBarcode pomija niepotrzebne kontrole formatów:

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

Jak stworzyć skaner kodów kreskowych MAUI przy użyciu IronBarcode: Rysunek 4 – Wiele kodów zeskanowanych z tego samego obrazu

Ustawienie ExpectMultipleBarcodes = true nakazuje IronBarcode kontynuowanie skanowania po znalezieniu pierwszego wyniku, co jest niezbędne w procesach magazynowych, gdzie jeden list przewozowy może zawierać kilkanaście BarCodes.

Opcje prędkości czytania

Wyliczenie ReadingSpeed oferuje cztery poziomy: ExtremeDetail, Detailed, Balanced oraz QuickScan. Użyj QuickScan w sytuacjach, gdy przetwarzasz duże ilości BarCodes, które są wyraźne i dobrze oświetlone. Przejdź do Detailed lub ExtremeDetail podczas skanowania z obrazów z aparatu o niskiej rozdzielczości lub etykiet, które zostały częściowo uszkodzone.

Więcej informacji na temat dostosowywania opcji BarcodeReaderOptions, w tym filtrów korekcji obrazu i progów pewności, można znaleźć w dokumentacji zawierającej szczegółowe przykłady.

Korekcja obrazu i przetwarzanie wstępne

IronBarcode zawiera wbudowaną funkcję korekcji obrazu, która automatycznie radzi sobie z obróconymi, przekrzywionymi lub słabo oświetlonymi kodami kreskowymi. Można również ręcznie zastosować filtry przetwarzania wstępnego poprzez BarcodeReaderOptions.ImageFilters:

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

Filtry wstępnego przetwarzania są szczególnie przydatne, gdy aplikacja jest przeznaczona dla starszych urządzeń z systemem Android wyposażonych w czujniki aparatu o niższej jakości lub gdy użytkownicy mogą fotografować BarCodes w nieoptymalnych warunkach oświetleniowych, takich jak magazyny lub środowiska zewnętrzne.

Jak radzisz sobie z typowymi scenariuszami rozwiązywania problemów?

Nawet przy dobrze skonfigurowanym skanerze BARCODE kodów kreskowych MAUI mogą pojawić się problemy związane z zachowaniem konkretnego urządzenia, jakością obrazu lub ograniczeniami platformy.

Aparat się nie otwiera

Jeśli kamera nie uruchamia się, sprawdź, czy uprawnienia są poprawnie zadeklarowane zarówno w AndroidManifest.xml, jak i Info.plist. Następnie ponownie wdróż aplikację z czystej kompilacji, a nie poprzez hot reload. W systemie Android sprawdź również, czy Twoje urządzenie testowe korzysta z niestandardowej konfiguracji aparatu — niektóre urządzenia z wieloma aparatami wymagają wyraźnego wyboru obiektywu.

W symulatorze MediaPicker.CapturePhotoAsync() nie jest obsługiwany. Zawsze testuj funkcje aparatu na fizycznym urządzeniu. Emulator obsługuje PickPhotoAsync do wyboru galerii, co można wykorzystać do podstawowego testowania interfejsu użytkownika z użyciem wstępnie załadowanych obrazów.

Niska dokładność skanowania

Jeśli IronBarcode nie zwraca żadnych wyników lub zwraca nieprawidłowe wartości, spróbuj wprowadzić następujące zmiany:

  • Zwiększ Speed do ReadingSpeed.Detailed lub ExtremeDetail
  • Dodaj SharpenFilter i ContrastFilter do potoku filtrów obrazów
  • Upewnij się, że rozdzielczość przechwyconego obrazu wynosi co najmniej 720p; niższe rozdzielczości powodują pominięcia w wykrywaniu w przypadku gęstych formatów, takich jak Data Matrix
  • Sprawdź, czy typ BARCODE jest zawarty w masce ExpectBarcodeTypes

Przewodnik rozwiązywania problemów IronBarcode zawiera dodatkowe kroki diagnostyczne dotyczące problemów związanych z formatami.

Zarządzanie pamięcią

Duże obrazy z kamery zajmują dużo pamięci po załadowaniu do MemoryStream. Zawsze używaj instrukcji using we wszystkich obiektach strumienia, aby zapewnić ich usunięcie. W przypadku ciągłych procesów skanowania, w których użytkownicy skanują wiele elementów po kolei, należy również wyraźnie wywołać bitmap.Dispose() po przetworzeniu, zamiast czekać na działanie modułu czyszczącego pamięć.

Na urządzeniach z systemem Android o ograniczonej przestrzeni sterty warto rozważyć zmniejszenie rozdzielczości obrazu przed przekazaniem go do IronBarcode, jeśli skanowane są czyste kody kreskowe o wysokim kontraście, które nie wymagają pełnej rozdzielczości do dokładnego odczytu.

Zachowanie specyficzne dla platformy iOS

W systemie iOS, gdy aplikacja po raz pierwszy prosi o pozwolenie na dostęp do aparatu, system wyświetla jednorazowe okno dialogowe. Jeśli użytkownik to odrzuci, kolejne wywołania CapturePhotoAsync spowodują wygenerowanie PermissionException. Rozwiąż ten przypadek, kierując użytkownika do sekcji Ustawienia, co możesz zrobić za pomocą AppInfo.ShowSettingsUI().

Przed przesłaniem do App Store upewnij się, że NSCameraUsageDescription znajduje się w Info.plist. Brakujące ciągi dotyczące prywatności powodują automatyczne odrzucenie bez szczegółowego wyjaśnienia ze strony zespołu recenzentów. Zapoznaj się z wytycznymi Apple Human Interface Guidelines dotyczącymi dostępu do aparatu, aby poznać najlepsze praktyki w zakresie czasu wysyłania żądań o uprawnienia i komunikatów.

Jakie są Twoje kolejne kroki?

Teraz, gdy masz już działający skaner kodów kreskowych MAUI z IronBarcode, dostępnych jest kilka ścieżek w zależności od wymagań Twojej aplikacji:

  • Generowanie kodów kreskowych — IronBarcode zawiera interfejs API do generowania kodów kreskowych, umożliwiający tworzenie kodów QR, etykiet Code 128 i innych formatów na podstawie danych tekstowych
  • Skanowanie wsadowe — przetwarzaj wiele plików graficznych w pętli, używając BarcodeReader.ReadAsync z ExpectMultipleBarcodes = true; zobacz przykłady skanowania partii
  • Wyodrębnianie barcode'ów z plików PDF — IronBarcode może odczytywać barcode'y osadzone w dokumentach PDF przy użyciu tej samej klasy BarcodeReader; zapoznaj się z dokumentacją dotyczącą odczytu kodów kreskowych w formacie PDF
  • Stylizacja i branding — dostosuj wygląd generowanych BARCODE-ów za pomocą kolorów, logo i adnotacji; zobacz opcje stylizacji kodów kreskowych
  • Inne produkty IronSoftware — jeśli Twoja aplikacja MAUI wymaga również generowania plików PDF, OCR lub obsługi arkuszy kalkulacyjnych, zapoznaj się z pełnym pakietem Iron Suite, aby uzyskać spójne możliwości międzyplatformowe

Zacznij od bezpłatnej licencji próbnej, aby wdrożyć rozwiązanie bez ograniczeń w okresie oceny. Aby zapoznać się z opcjami licencji produkcyjnych i cenami hurtowymi, odwiedź stronę z cennikiem IronBarcode. Portal dokumentacji IronBarcode oraz repozytorium IronBarcode na GitHubie zawierają dodatkowe przykłady kodu oraz wsparcie społeczności.

Często Zadawane Pytania

Jaka jest zaleta korzystania z IronBarcode jako skanera kodów kreskowych dla MAUI?

IronBarcode przetwarza kody kreskowe na poziomie obrazu, działa w trybie offline, obsługuje ponad 30 formatów i radzi sobie z trudnymi warunkami, takimi jak przekrzywione kąty i słabe oświetlenie, bez dodatkowej konfiguracji.

Czy IronBarcode może wykrywać wiele kodów kreskowych na jednym obrazie?

Tak. Ustaw ExpectMultipleBarcodes = true w BarcodeReaderOptions i wywołaj BarcodeReader.ReadAsync. IronBarcode zwróci wszystkie wykryte kody kreskowe w kolekcji wyników.

Jak skonfigurować uprawnienia kamery dla systemów Android i iOS w MAUI?

W przypadku systemu Android należy dodać elementy CAMERA uses-permission i uses-feature do pliku AndroidManifest.xml. W przypadku systemu iOS należy dodać element NSCameraUsageDescription wraz z czytelnym dla człowieka wyjaśnieniem do pliku Info.plist.

Czy IronBarcode obsługuje skanowanie kodów kreskowych w trybie offline?

Tak. IronBarcode przetwarza obrazy całkowicie na urządzeniu, bez wysyłania danych do zewnętrznych serwerów, co jest ważne w przypadku aplikacji wymagających zachowania prywatności.

Jakie formaty kodów kreskowych obsługuje IronBarcode w MAUI?

IronBarcode obsługuje kody QR, Code 128, Code 39, EAN-13, UPC-A, Data Matrix, PDF417, Aztec, MaxiCode i wiele innych. Możesz wybrać konkretne formaty za pomocą flag BarcodeEncoding.

Jak poprawić dokładność skanowania w przypadku obrazów o niskiej jakości?

Zmień ReadingSpeed na Detailed lub ExtremeDetail, dodaj SharpenFilter i ContrastFilter do ImageFilters oraz upewnij się, że przechwycony obraz ma rozdzielczość co najmniej 720p.

Czy IronBarcode może odczytywać kody kreskowe z plików PDF w aplikacji MAUI?

Tak. Klasa BarcodeReader w IronBarcode może wyodrębniać kody kreskowe osadzone w dokumentach PDF przy użyciu tego samego interfejsu API ReadAsync, co w przypadku plików graficznych.

Jak obsłużyć wyjątek PermissionException, gdy dostęp do kamery jest zablokowany?

Przechwyć wyjątek PermissionException w bloku try/catch i wywołaj AppInfo.ShowSettingsUI(), aby przekierować użytkownika do ustawień urządzenia, gdzie może ponownie włączyć dostęp do aparatu.

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie