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:
| 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"
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" />
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>
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>
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
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:

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

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)

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)
}
}
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
SpeeddoReadingSpeed.DetailedlubExtremeDetail - Dodaj
SharpenFilteriContrastFilterdo 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.ReadAsynczExpectMultipleBarcodes = 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.




