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 koncentruje się na podglądzie kamery, IronBarcode skutecznie odczytuje kody kreskowe nawet w trudnych warunkach - skrzywione 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 rozwiazuje to, pracujac na warstwie przetwarzania obrazow -- najpierw przechwytujesz obraz przez MediaPicker MAUI, nastepnie przekazujesz bajty do IronBarcode do 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 Kod QR, Macierz danych, Aztec, PDF417 Płatności mobilne, sprzedaż biletów, produkcja
Poczta USPS, Poczta Krolewska, 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 .NET MAUI App w Visual Studio 2022. Nazwij go BarcodeScannerApp i wybierz .NET 10 jako docelowy framework. 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 na swoim projekcie w Eksploratorze rozwiazan, wybierz opcje "Zarzadzaj pakietami NuGet", znajdz IronBarCode i zainstaluj najnowsza stabilna wersje. 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. Najlepsze miejsce to MauiProgram.cs przed uruchomieniem app buildera:

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

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

Uzyskaj klucz licencji probowej ze strony internetowej Iron Software. Triale kluczy pozwolą ci na ocene wszystkich funkcji bez ograniczen czasowych podczas rozwoju, chociaz wyjscie moze zawierac znak wodny do czasu wykupienia pelnej 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. Kazda platforma wymaga specyficznej konfiguracji w plikach manifestu, zanim MediaPicker.CapturePhotoAsync() sie powiedzie.

Uprawnienia w systemie Android

Edytuj Platforms/Android/AndroidManifest.xml, aby zadeklarowac dostep 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

Element android.permission.CAMERA prosi uzytkownika o pozwolenie podczas uruchamiania. Deklaracje uses-feature informuja Google Play Store, ze Twoja aplikacja wymaga sprzetu kamery i mozliwosci autofokusa. Bez nich urządzenia z systemem Android mogą przyznać uprawnienie, ale nadal blokować dostęp do aparatu wewnętrznie.

Dla Androida 13 i nowszych (API poziom 33+), moze rowniez zajsc potrzeba obslugi szczegolowych uprawnien multimedialnych w MainActivity.cs uzywajac ActivityCompat.RequestPermissions. Abstrakcja MediaPicker MAUI obsluguje wiekszosc tego automatycznie, ale zalecane jest testowanie na fizycznym urzadzeniu przed wydaniem.

Uprawnienia w systemie iOS

Zmodyfikuj Platforms/iOS/Info.plist, aby zawieral opis uzycia 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ń systemowych wyświetlanym użytkownikowi przy pierwszym żądaniu dostępu do aparatu przez aplikację.

Dla iPadOS, rozwaz dodanie NSPhotoLibraryUsageDescription, jesli planujesz pozwolic uzytkownikom skanowac kody kreskowe z zapisanych zdjec, oprocz zywej kamery.

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 obsluguje wiekszosc tego na poziomie szablonow, ale upewnij sie, ze Package.appxmanifest na Windows zawiera mozliwosc urzadzenia webcam.

Jak stworzyć interfejs skanera BarCode?

Zaprojektuj interfejs uzytkownika w MainPage.xaml, ktory daje uzytkownikom jasna informacje zwrotna 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 pokazuje wykryty format kodu kreskowego wraz z zdekodowana wartoscia, co pomaga podczas debugowania i weryfikacji uzytkownika.

Dodawanie informacji zwrotnej o stanie skanowania

Dla wygladzonego doswiadczenia, rozwaz opakowanie przyciskow skanowania w ActivityIndicator, ktory pojawia sie podczas przetwarzania. Asynchroniczne API IronBarcode czyni to prosta sprawa -- mozesz ustalic IsRunning = true przed wywolaniem BarcodeReader.ReadAsync i zresetowac je w bloku finally.

Jak wdrożyć funkcję czytnika BarCode?

Zaimplementuj glowna logike 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

Implementacja ta uzywa wspoldzielonej metody pomocniczej ScanFromSource, aby uniknac duplikowania logiki przetwarzania obrazu pomiedzy kamera a galeria. Metoda AnyBitmap.FromBytes automatycznie obsluguje formaty JPEG, PNG, WebP i inne powszechnie spotykane formaty obrazow -- nie jest wymagana reczna detekcja formatu.

Obiekt wynikowy udostepnia first.Value (zdekodowany ciag), first.BarcodeType (enum formatu) i first.BarcodeImage (przyciety obraz z wykrytego regionu kodu kreskowego) oraz inne wlasciwosci. 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 stworzyc czytnik kodow kreskowych MAUI uzywajac IronBarcode: Rysunek 2 - Test wprowadzania kodu kreskowego

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

Jak stworzyc czytnik kodow kreskowych MAUI uzywajac IronBarcode: Rysunek 3 - Zdekodowana wartosc kodu kreskowego

Jak skonfigurować zaawansowane opcje skanowania?

IronBarcode udostepnia obiekt BarcodeReaderOptions, ktory pozwala na doprecyzowanie zachowania detekcji dla Twojego konkretnego przypadku uzycia. 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 stworzyc czytnik kodow kreskowych MAUI uzywajac IronBarcode: Rysunek 4 - Wiele kodow zeskanowanych z tego samego obrazu

Ustawienie ExpectMultipleBarcodes = true instruuje IronBarcode, aby kontynuowal skanowanie po znalezieniu pierwszego wyniku, co jest istotne dla przeplywow pracy w magazynie, gdzie pojedyncza list przewozowy moze zawierac kilkanascie kodow kreskowych.

Opcje prędkości czytania

Enum ReadingSpeed oferuje cztery poziomy: ExtremeDetail, Detailed, Balanced i QuickScan. Uzyj QuickScan w scenariuszach o duzej objetosci, gdzie kody kreskowe sa czyste i dobrze oswietlone. Przelacz na Detailed lub ExtremeDetail przy skanowaniu z niskorozdzielczymi uchwytami kamery lub etykietami, ktore zostaly czesciowo 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. Mozesz takze zastosowac filtry przed przetworzeniem recznie za pomoca 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

Jesli kamera nie uruchamia sie, upewnij sie, ze uprawnienia sa poprawnie zadeklarowane w AndroidManifest.xml oraz 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.

Na symulatorze, MediaPicker.CapturePhotoAsync() nie jest wspierany. Zawsze testuj funkcje aparatu na fizycznym urzadzeniu. Emulator wspiera PickPhotoAsync do wyboru z galerii, co mozesz uzyc do podstawowych testow UI z wczesniej zaladowanymi obrazami.

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:

  • Zwieksz Speed do ReadingSpeed.Detailed lub ExtremeDetail
  • Dodaj SharpenFilter i ContrastFilter do rury filtrujacej obraz
  • 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
  • Sprawdz, czy typ kodu kreskowego jest zawarty w Twojej masce ExpectBarcodeTypes

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

Zarządzanie pamięcią

Duze obrazy z kamer zabieraja znaczaca ilosc pamieci, gdy sa ladowane do MemoryStream. Zawsze uzywaj deklaracji using dla wszystkich obiektow strumieniowych, aby zapewnic ich zwolnienie. Dla ciaglych przeplywow skanowania, gdzie uzytkownicy skanuja wiele elementow w sekwencji, wywolaj bitmap.Dispose() jawnie po przetworzeniu zamiast czekac na czyszczenie dynamiczne.

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. Jesli uzytkownik odmowi, nastepne wywolania CapturePhotoAsync wyrzuca PermissionException. Obsluz ten przypadek, kierujac uzytkownika do Ustawien, co mozna zrobic za pomoca AppInfo.ShowSettingsUI().

Upewnij sie, ze NSCameraUsageDescription jest obecny w Info.plist przed zgloszeniem do Sklepu z Aplikacjami. 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 plikow obrazow w petli za pomoca BarcodeReader.ReadAsync z ExpectMultipleBarcodes = true; zobacz przyklady skanowania grupowego
  • Wyciaganie kodow kreskowych z PDF -- IronBarcode moze czytac kody kreskowe osadzone w dokumentach PDF za pomoca 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 Iron Software -- jesli twoja aplikacja MAUI rowniez potrzebuje generowania PDF, OCR lub wsparcia arkuszy kalkulacyjnych, eksploruj pelne Iron Suite dla spójnych mozliwosci miedzyplatformowych

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.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie