Saltar al pie de página
USO DE IRONBARCODE

Escáner de código de barras MAUI con IronBarcode: Guía paso a paso

Las aplicaciones móviles dependen cada vez más del escaneo de códigos de barras para la gestión de inventario, sistemas de puntos de venta y seguimiento de productos. Crear un escáner de códigos de barras MAUI te permite integrar la detección de códigos de barras directamente en tu aplicación .NET MAUI, combinando un flujo de cámara con el procesamiento de archivos de imagen para detectar códigos QR, Data Matrix y otros formatos de código de barras. Si bien muchas bibliotecas se centran en la vista previa de la cámara, IronBarcode se destaca en la lectura precisa de códigos de barras incluso en condiciones difíciles (ángulos sesgados, poca iluminación y etiquetas dañadas), todo ello sin necesidad de configuración adicional.

Esta guía recorre cada paso de la implementación del escaneo de códigos de barras en un proyecto .NET MAUI utilizando IronBarcode. Al final, podrá escanear múltiples códigos de barras desde un solo archivo de imagen, capturar códigos de barras desde la cámara de un dispositivo e integrar con confianza la biblioteca en sus propios proyectos multiplataforma.

¿Cuáles son los requisitos previos para construir un escáner de código de barras MAUI?

Antes de comenzar, asegúrese de que su entorno de desarrollo esté en orden:

  • Visual Studio 2022 (v17.8 o posterior) con la carga de trabajo .NET MAUI instalada
  • .NET 10 SDK : descarga desde el sitio oficial de .NET
  • Conocimientos básicos de C# : la familiaridad con los patrones async/await será útil.
  • Dispositivo físico o emulador configurado para probar la cámara
  • Licencia IronBarcode : hay una prueba gratuita disponible para evaluación

Asegurarse de que Visual Studio tenga la carga de trabajo MAUI instalada antes de crear el proyecto ahorra un tiempo significativo en la resolución de problemas más adelante. Puede verificar esto en el instalador de Visual Studio en "Componentes individuales" buscando "Desarrollo de UI de aplicaciones multiplataforma .NET ".

Entendiendo cómo IronBarcode se integra en MAUI

.NET MAUI le ofrece una única base de código orientada a Android, iOS, macOS y Windows. El desafío con el escaneo de códigos de barras en este entorno es que cada plataforma maneja el acceso a la cámara de manera diferente. IronBarcode aborda esto trabajando en la capa de procesamiento de imágenes - usted captura la imagen a través de MediaPicker de MAUI, a continuación, entrega los bytes a IronBarcode para su análisis.

Esta separación de preocupaciones mantiene su código limpio y evita los SDK de código de barras específicos de la plataforma. El modelo de procesamiento fuera de línea de IronBarcode también significa que los datos del código de barras nunca salen del dispositivo, lo que es importante para las aplicaciones en industrias reguladas.

Formatos de códigos de barras compatibles

IronBarcode lee una amplia gama de formatos , entre los que se incluyen:

Formatos de código de barras compatibles con IronBarcode
Categoría de formato Formatos Casos de uso comunes
1D lineal Código 128, Código 39, EAN-13, UPC-A, ITF Comercio minorista, logística y atención sanitaria
Matriz 2D Código QR, Matriz de datos, Aztec, PDF417 Pagos móviles, venta de billetes, fabricación
Correo USPS, Royal Mail, Deutsche Post Servicios de envío y postales
Especialidad MaxiCode, GS1, MicroPDF417 Cadena de suministro, transporte, paquetería

¿Cómo se configura un proyecto de escaneo de código de barras MAUI?

Empieza por crear un nuevo proyecto .NET MAUI App en Visual Studio 2022. Nómbralo BarcodeScannerApp y selecciona .NET 10 como marco de trabajo de destino. Visual Studio genera la estructura de proyecto MAUI estándar con carpetas específicas de la plataforma para Android, iOS, macOS y Windows.

Instalación de IronBarcode mediante NuGet

Abra la consola del Administrador de paquetes NuGet y ejecute:

Install-Package BarCode

Como alternativa, haga clic con el botón derecho en su proyecto en el Explorador de soluciones, seleccione "Administrar paquetes NuGet", busque IronBarCode e instale la última versión estable. Específicamente para proyectos .NET MAUI , el paquete NuGet de IronBarcode incluye todas las dependencias nativas necesarias.

Activando su licencia

Después de la instalación, active IronBarcode con su clave de licencia al comienzo del ciclo de vida de la aplicación. El mejor lugar es en MauiProgram.cs antes de que se ejecute el app builder:

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

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

Obtenga una clave de licencia de prueba gratuita en el sitio web de IronSoftware. Las claves de prueba le permiten evaluar todas las funciones sin límite de tiempo durante el desarrollo, aunque el resultado puede incluir una marca de agua de prueba hasta que aplique la licencia completa.

¿Cómo configurar los permisos de la cámara para Android e iOS?

Los permisos de cámara específicos de la plataforma son esenciales para la funcionalidad de escaneo de códigos de barras. Cada plataforma requiere una configuración específica en sus archivos de manifiesto antes de que MediaPicker.CapturePhotoAsync() tenga éxito.

Permisos de Android

Editar Platforms/Android/AndroidManifest.xml para declarar el acceso a la cámara:

<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

La entrada android.permission.CAMERA solicita permiso de ejecución al usuario. Las declaraciones uses-feature informan a Google Play Store de que tu aplicación requiere hardware de cámara y capacidad de autoenfoque. Sin estos, los dispositivos Android pueden conceder la solicitud de permiso pero aún así bloquear el acceso a la cámara internamente.

Para Android 13 y versiones posteriores (nivel de API 33+), es posible que también necesite gestionar permisos multimedia granulares en su MainActivity.cs utilizando ActivityCompat.RequestPermissions. La abstracción MAUI MediaPicker maneja la mayor parte de esto de forma automática, pero se recomienda la prueba física del dispositivo antes de su lanzamiento.

Permisos de iOS

Modifique Platforms/iOS/Info.plist para incluir la descripción del uso de la cámara:

<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 requiere una explicación legible para humanos para cada permiso sensible a la privacidad. El proceso de revisión de la App Store de Apple rechazará su aplicación si esta descripción falta o es vaga. El texto aparece en el cuadro de diálogo de permisos del sistema que se muestra al usuario la primera vez que la aplicación solicita acceso a la cámara.

Para iPadOS, considere también la posibilidad de añadir NSPhotoLibraryUsageDescription si tiene previsto permitir a los usuarios escanear códigos de barras de fotos guardadas además de la cámara en directo.

Windows y macOS

Para los destinos de Windows Desktop y macOS, los permisos de acceso a la cámara se administran a través del manifiesto de la aplicación y los archivos de derechos respectivamente. El marco MAUI maneja la mayor parte de esto a nivel de plantilla, pero compruebe que Package.appxmanifest en Windows incluye la capacidad del dispositivo de cámara web.

¿Cómo se crea la interfaz del escáner de código de barras?

Diseñe una interfaz de usuario en MainPage.xaml que proporcione a los usuarios información clara durante el proceso de escaneado. Un diseño minimalista pero funcional incluye una vista previa de la imagen, un área de visualización de resultados y un botón de activación del escaneo:

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

El diseño proporciona dos rutas de escaneo: capturar una nueva foto con la cámara y elegir una imagen existente de la galería. Esto es importante para los flujos de trabajo en los que los usuarios fotografían códigos de barras con antelación o reciben imágenes por correo electrónico. El FormatLabel muestra el formato de código de barras detectado junto con el valor descodificado, lo que ayuda durante la depuración y la verificación del usuario.

Agregar comentarios sobre el estado del escaneo

Para que la experiencia sea mejor, considere la posibilidad de envolver los botones de escaneo en un ActivityIndicator que se muestre mientras se está procesando. La API asíncrona de IronBarcode hace que esto sea sencillo: puede establecer IsRunning = true antes de llamar a BarcodeReader.ReadAsync y restablecerlo en el bloque finally.

¿Cómo se implementa la funcionalidad del lector de código de barras?

Implementar el núcleo de la lógica de escaneo en MainPage.xaml.cs. El código a continuación maneja tanto la captura de la cámara como la selección de la galería, con patrones asincrónicos adecuados y manejo de errores:

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

Esta implementación utiliza un método de ayuda compartido ScanFromSource para evitar duplicar la lógica de procesamiento de imágenes entre las rutas de la cámara y la galería. El método AnyBitmap.FromBytes maneja automáticamente JPEG, PNG, WebP y otros formatos de imagen comunes, sin necesidad de detección manual del formato.

El objeto resultante expone first.Value (la cadena decodificada), first.BarcodeType (el formato enum), y first.BarcodeImage (una imagen recortada de la región del código de barras detectado) entre otras propiedades. Consulte la documentación de la clase BarcodeResult para obtener la lista completa.

Prueba de la implementación del escaneo

Con el código en su lugar, puedes probarlo con un código de barras estándar:

Cómo crear un escáner de códigos de barras MAUI utilizando IronBarcode: Figura 2 - Código de barras de prueba de entrada

Después de escanear, el valor decodificado aparece en la pantalla:

Cómo crear un escáner de códigos de barras MAUI utilizando IronBarcode: Figura 3 - Valor del código de barras escaneado

¿Cómo configurar las opciones de escaneo avanzadas?

IronBarcode expone un objeto BarcodeReaderOptions que le permite ajustar el comportamiento de detección para su caso de uso específico. Comprender estas opciones le ayudará a equilibrar la velocidad y la precisión en función de las necesidades de su aplicación.

Dirigido a tipos específicos de códigos de barras

Especificar los tipos de códigos de barras exactos que espera reduce drásticamente el tiempo de procesamiento porque IronBarcode omite las verificaciones de formato que no necesita:

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

Cómo crear un escáner de código de barras MAUI con IronBarcode: Figura 4 - Múltiples códigos escaneados desde la misma imagen

La configuración de ExpectMultipleBarcodes = true indica a IronBarcode que continúe escaneando después de encontrar el primer resultado, lo que resulta esencial para los flujos de trabajo de almacén en los que un solo albarán puede contener una docena de códigos de barras.

Opciones de velocidad de lectura

El ReadingSpeed enum ofrece cuatro niveles: ExtremeDetail, Detailed, Balanced y QuickScan. Utilice QuickScan para situaciones de gran volumen en las que los códigos de barras estén limpios y bien iluminados. Cambie a Detailed o ExtremeDetail cuando escanee a partir de capturas de cámara de baja resolución o etiquetas que hayan sido parcialmente dañadas.

Para obtener más información sobre cómo ajustar BarcodeReaderOptions , incluidos los filtros de corrección de imagen y los umbrales de confianza, la documentación proporciona ejemplos detallados.

Corrección y preprocesamiento de imágenes

IronBarcode incluye corrección de imagen incorporada que maneja automáticamente códigos de barras rotados, torcidos o mal iluminados. También puede aplicar filtros de preprocesamiento manualmente a través de 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

Los filtros de preprocesamiento son particularmente útiles cuando la aplicación apunta a dispositivos Android más antiguos con sensores de cámara de menor calidad, o cuando es probable que los usuarios fotografíen códigos de barras en condiciones de iluminación subóptimas, como almacenes o entornos al aire libre.

¿Cómo manejar situaciones comunes de resolución de problemas?

Incluso con un escáner de código de barras MAUI bien configurado, pueden surgir problemas debido al comportamiento específico del dispositivo, problemas de calidad de la imagen o limitaciones de la plataforma.

La cámara no se abre

Si la cámara no se inicia, compruebe que los permisos están correctamente declarados en AndroidManifest.xml y Info.plist. Luego, vuelva a implementar la aplicación desde una compilación limpia en lugar de una recarga en caliente. En Android, verifique también si su dispositivo de prueba utiliza una configuración de cámara no estándar: algunos dispositivos con múltiples cámaras requieren una selección de lente explícita.

En el simulador, MediaPicker.CapturePhotoAsync() no es compatible. Pruebe siempre las funciones de la cámara en un dispositivo físico. El emulador admite PickPhotoAsync para la selección de la galería, que puede utilizar para realizar pruebas básicas de la interfaz de usuario con imágenes precargadas.

Mala precisión de escaneo

Si IronBarcode no devuelve resultados o valores incorrectos, pruebe estos ajustes:

  • Aumente el Speed a ReadingSpeed.Detailed o ExtremeDetail
  • Añadir SharpenFilter y ContrastFilter al proceso de filtrado de imágenes
  • Asegúrese de que la resolución de la imagen capturada sea de al menos 720p; las resoluciones más bajas provocan detecciones fallidas con formatos densos como Data Matrix.
  • Compruebe si el tipo de código de barras está incluido en su máscara ExpectBarcodeTypes

La guía de solución de problemas de IronBarcode cubre pasos de diagnóstico adicionales para problemas específicos del formato.

Gestión de la memoria

Las imágenes de cámara de gran tamaño consumen mucha memoria cuando se cargan en MemoryStream. Utilice siempre declaraciones using en todos los objetos de flujo para garantizar su eliminación. Para flujos de trabajo de escaneo continuo en los que los usuarios escanean varios elementos en secuencia, llame también a bitmap.Dispose() explícitamente después del procesamiento en lugar de esperar al recolector de basura.

En dispositivos Android con espacio de almacenamiento limitado, considere reducir la resolución de la imagen antes de pasarla a IronBarcode si los escaneos son de códigos de barras limpios y de alto contraste que no requieren una resolución completa para decodificarse con precisión.

Comportamiento de iOS específico de la plataforma

En iOS, la primera vez que la aplicación solicita permiso para la cámara, el sistema muestra un cuadro de diálogo único. Si el usuario lo niega, las siguientes llamadas a CapturePhotoAsync lanzarán un PermissionException. Maneje este caso dirigiendo al usuario a Configuración, lo que puede hacer con AppInfo.ShowSettingsUI().

Confirma que NSCameraUsageDescription está presente en Info.plist antes de enviarlo a la App Store. La falta de cadenas de privacidad provoca un rechazo automático sin una explicación detallada del equipo de revisión. Revise las Pautas de interfaz humana de Apple para el acceso a la cámara para conocer las mejores prácticas sobre el tiempo y los mensajes de las solicitudes de permiso.

¿Cuales son tus próximos pasos?

Ahora que tiene un escáner de código de barras MAUI en funcionamiento con IronBarcode, hay varias rutas disponibles según los requisitos de su aplicación:

  • Generar códigos de barras : IronBarcode incluye una API de generación de códigos de barras para crear códigos QR, etiquetas Code 128 y otros formatos a partir de datos de cadena.
  • Escaneado por lotes -- procesa múltiples archivos de imagen en un bucle utilizando BarcodeReader.ReadAsync con ExpectMultipleBarcodes = true; Vea los ejemplos de escaneo por lotes
  • Extracción de códigos de barras en PDF -- IronBarcode puede leer códigos de barras incrustados en documentos PDF utilizando la misma clase BarcodeReader; Explore la documentación sobre lectura de códigos de barras PDF.
  • Estilo y marca : personalice la salida visual de los códigos de barras generados con colores, logotipos y anotaciones; ver las opciones de estilo del código de barras
  • Otros productos de IronSoftware : si su aplicación MAUI también necesita generación de PDF, OCR o compatibilidad con hojas de cálculo, explore la Iron Suite completa para obtener capacidades multiplataforma consistentes.

Comience con una licencia de prueba gratuita para implementar sin restricciones durante su período de evaluación. Para conocer las opciones de licencias de producción y precios por volumen, visite la página de precios de IronBarcode . El portal de documentación de IronBarcode y el repositorio GitHub de IronBarcode proporcionan ejemplos de código adicionales y soporte de la comunidad.

Preguntas Frecuentes

¿Cuál es la ventaja de usar IronBarcode para un escáner de códigos de barras MAUI?

IronBarcode procesa códigos de barras en la capa de imagen, funciona sin conexión, admite más de 30 formatos y maneja condiciones desafiantes como ángulos sesgados y poca iluminación sin configuración adicional.

¿Puede IronBarcode detectar múltiples códigos de barras en una imagen?

Sí. Establezca ExpectMultipleBarcodes = true en BarcodeReaderOptions y llame a BarcodeReader.ReadAsync. IronBarcode devolverá todos los códigos de barras detectados en la colección de resultados.

¿Cómo configuro los permisos de la cámara para Android e iOS en MAUI?

Para Android, agregue los elementos "CÁMARA uses-permission" y "uses-feature" a AndroidManifest.xml. Para iOS, agregue NSCameraUsageDescription con una explicación legible a Info.plist.

¿ IronBarcode admite el escaneo de códigos de barras sin conexión?

Sí. IronBarcode procesa las imágenes completamente en el dispositivo sin enviar datos a servidores externos, lo cual es importante para las aplicaciones que priorizan la privacidad.

¿Qué formatos de código de barras admite IronBarcode en MAUI?

IronBarcode es compatible con códigos QR, Código 128, Código 39, EAN-13, UPC-A, Data Matrix, PDF417, Aztec, MaxiCode y muchos más. Puede seleccionar formatos específicos mediante las opciones de codificación de código de barras.

¿Cómo puedo mejorar la precisión del escaneo para imágenes de mala calidad?

Cambie ReadingSpeed ​​a Detailed o ExtremeDetail, agregue SharpenFilter y ContrastFilter a ImageFilters y asegúrese de que la imagen capturada tenga una resolución de al menos 720p.

¿Puede IronBarcode leer códigos de barras de archivos PDF en una aplicación MAUI?

Sí. La clase BarcodeReader de IronBarcode puede extraer códigos de barras incrustados en documentos PDF utilizando la misma API ReadAsync utilizada para archivos de imagen.

¿Cómo manejo PermissionException cuando se niega el acceso a la cámara?

Capture PermissionException en un bloque try/catch y llame a AppInfo.ShowSettingsUI() para dirigir al usuario a la configuración de su dispositivo, donde puede volver a habilitar el acceso a la cámara.

Jordi Bardia
Ingeniero de Software
Jordi es más competente en Python, C# y C++. Cuando no está aprovechando sus habilidades en Iron Software, está programando juegos. Compartiendo responsabilidades para pruebas de productos, desarrollo de productos e investigación, Jordi agrega un valor inmenso a la mejora continua del producto. La experiencia variada lo mantiene ...
Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame