Reconocer códigos de barras en imágenes en la aplicación MAUI para Android

Categoría del blog: Barcode.NETAndroid

08.05.2024

Este artículo explica cómo crear una aplicación MAUI, cargar imágenes desde la galería de imágenes y reconocer códigos de barras en imágenes en Android. Para el reconocimiento de códigos de barras se utiliza VintaSoft Barcode .NET SDK.

Estos son los pasos que se deben realizar:
  1. Crear una aplicación MAUI en blanco.
    Abrir Visual Studio .NET 2022 y crear un nuevo proyecto, del tipo de aplicación .NET MAUI:

    Configurar el proyecto para usar .NET 8.0:

  2. Especifique que la aplicación MAUI se usará en Android.
    Abra el archivo del proyecto y seleccione los frameworks de destino: Android.

  3. Agregue una referencia al nuget-package de Vintasoft Barcode a la aplicación MAUI.
    Agregue una referencia al Vintasoft.Barcode nuget-package a la aplicación MAUI.

  4. Especificar que el compilador .NET no debe recortar/minimizar los ensamblados Vintasoft ni el ensamblado Mono.Android.
    Abrir el archivo de proyecto MAUI y agregar elementos de proyecto, que permiten especificar que el compilador .NET no debe recortar/minimizar los ensamblados Vintasoft ni el ensamblado Mono.Android si los ensamblados .NET de la aplicación MAUI deben recortarse/minimizarse.


    Aquí están los elementos del proyecto que permiten especificar que el compilador .NET no debe recortar/minimizar los ensamblados Vintasoft ni el ensamblado Mono.Android si los ensamblados .NET de la aplicación MAUI deben recortarse/minimizarse:
    <ItemGroup>
        <TrimmerRootAssembly Include="Vintasoft.Barcode" RootMode="library" />
        <TrimmerRootAssembly Include="Vintasoft.Shared" RootMode="library" />
        <TrimmerRootAssembly Include="Mono.Android" RootMode="library" />
    </ItemGroup>
    
  5. Añadir un control de IU para mostrar la imagen abierta, un botón para abrir la imagen desde la galería y un botón para reconocer códigos de barras en la imagen abierta.
    Abrir el diseño XAML de la página principal en el archivo "MainPage.xaml" y añadir un control de IU para mostrar la imagen abierta, un botón para abrir la imagen desde la galería y un botón para reconocer códigos de barras en la imagen abierta.


    Aquí está el código XAML de la página principal (la página contiene un control de IU para mostrar la imagen abierta, un botón para abrir la imagen desde la galería y un botón para reconocer códigos de barras en la imagen abierta):
    <?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="MauiApp1.MainPage">
        <ScrollView>
            <VerticalStackLayout Padding="30,0" Spacing="25">
                <Image x:Name="barcodeImage" HeightRequest="500" Aspect="AspectFit"/>
                <HorizontalStackLayout>
                    <Button x:Name="openBarcodeButton" Text="Open Image..." Clicked="openBarcodeButton_Clicked" Margin="2"/>
                    <Button x:Name="recognizeBarcodeButton" Text="Recognize Barcode" Clicked="recognizeBarcodeButton_Clicked" Margin="2"/>
                </HorizontalStackLayout>
            </VerticalStackLayout>
        </ScrollView>
    </ContentPage>
    
  6. Agregue código C# que registre la versión de evaluación del de VintaSoft Barcode .NET SDK.
    Obtenga el código C# para usar la versión de evaluación en Android utilizando la forma descrita en la documentación e inserte el código obtenido en el código C# del archivo "MainPage.xaml.cs".


    Aquí hay un código C# que registra la versión de evaluación para VintaSoft Barcode .NET SDK:
    // get the application name
    string applicationName = Vintasoft.Barcode.BarcodeGlobalSettings.ApplicationName;
    // if MAUI application is using in Android
    if (applicationName.StartsWith("Android"))
    {
        // register the evaluation license for VintaSoft Barcode .NET SDK
        Vintasoft.Barcode.BarcodeGlobalSettings.Register("LINUX_EVAL_USER", "LINUX_EVAL_USER_EMAIL", "LINUX_EVAL_END_DATE", "LINUX_EVAL_REG_CODE");
    }
    
  7. Añadir código C# que abre la imagen desde la galería y reconoce códigos de barras en la imagen abierta.
    Abrir archivo "MainPage.xaml.cs" y agregue código C#, que abre la imagen de la galería de imágenes, al método openBarcodeButton_Clicked.
    Abra el archivo "MainPage.xaml.cs" y agregue código C#, que reconoce códigos de barras en la imagen abierta, al método recognizeBarcodeButton_Clicked.


    Aquí hay un código C# que abre la imagen desde la galería de imágenes y reconoce los códigos de barras en la imagen abierta:
    using Vintasoft.Barcode;
    
    namespace MauiApp1
    {
        public partial class MainPage : ContentPage
        {
    
            /// <summary>
            /// The current image stream.
            /// </summary>
            Stream _currentImageStream;
    
    
    
            public MainPage()
            {
                InitializeComponent();
            }
    
    
    
            private async void openBarcodeButton_Clicked(object sender, EventArgs e)
            {
                PickOptions options = new PickOptions();
                options.FileTypes = FilePickerFileType.Images;
                var result = await FilePicker.Default.PickAsync(options);
                if (result != null)
                {
                    LoadImage(File.OpenRead(result.FullPath));
                }
            }
    
            private async void recognizeBarcodeButton_Clicked(object sender, EventArgs e)
            {
                try
                {
                    recognizeBarcodeButton.IsEnabled = false;
    
                    if (_currentImageStream == null)
                        throw new Exception("Barcode image is not loaded.");
    
                    using (BarcodeReader reader = new BarcodeReader())
                    {
                        reader.Settings.ScanBarcodeTypes = BarcodeType.DataMatrix;
                        reader.Settings.BarcodeCharacteristics = BarcodeCharacteristics.NormalSizeBarcodes;
    
                        _currentImageStream.Position = 0;
                        IBarcodeInfo[] infos = reader.ReadBarcodes(_currentImageStream);
                        if (infos.Length > 0)
                        {
                            IBarcodeInfo info = infos[0];
                            await DisplayAlert("Barcode Reader", $"Recognized '{info.BarcodeType}' barcode ({reader.RecognizeTime.TotalMilliseconds} ms):\n{info.Value}", "OK");
                        }
                        else
                        {
                            throw new Exception($"No barcodes found ({reader.RecognizeTime.TotalMilliseconds} ms).");
                        }
                    }
                }
                catch (Exception ex)
                {
                    await DisplayAlert("Barcode Reader Error", ex.Message, "OK");
                }
                finally
                {
                    recognizeBarcodeButton.IsEnabled = true;
                }
            }
    
            /// <summary>
            /// Loads the image.
            /// </summary>
            /// <param name="stream">The image stream.</param>
            private async void LoadImage(Stream stream)
            {
                if (_currentImageStream != null)
                    _currentImageStream.Dispose();
    
                _currentImageStream = stream;
    
                try
                {
                    barcodeImage.Source = ImageSource.FromStream(() => CreateMemoryStream(_currentImageStream));
                }
                catch (Exception ex)
                {
                    await DisplayAlert("Load Image Error", ex.Message, "OK");
                }
            }
    
            /// <summary>
            /// Creates the memory stream from specified stream.
            /// </summary>
            /// <param name="stream">The stream.</param>
            /// <returns></returns>
            private static MemoryStream CreateMemoryStream(Stream stream)
            {
                MemoryStream result = new MemoryStream((int)stream.Length);
                CopyStream(stream, result);
                result.Position = 0;
                return result;
            }
    
            /// <summary>
            /// Copies the stream.
            /// </summary>
            /// <param name="sourceStream">The source stream.</param>
            /// <param name="destStream">The dest stream.</param>
            private static void CopyStream(Stream sourceStream, Stream destStream)
            {
                int bufferLength = 32 * 1024;
                try
                {
                    if (sourceStream.Length > 0 && sourceStream.Length < bufferLength)
                        bufferLength = (int)sourceStream.Length;
                }
                catch
                {
                }
                byte[] buffer = new byte[bufferLength];
    
                int bytesRead;
                while ((bytesRead = sourceStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    destStream.Write(buffer, 0, bytesRead);
                }
            }
    
        }
    }
    
  8. Firme el ensamblado de la aplicación MAUI usando un archivo de nombre seguro.
    Si tiene un archivo de nombre seguro, firme el ensamblado de la aplicación MAUI usando un archivo de nombre seguro.


    Si no tiene el archivo de nombre seguro, lea cómo generar un archivo de nombre seguro aquí.
  9. Ejecuta la aplicación MAUI en el emulador de Android y observa el resultado.