Riconoscimento del codice a barre in un'immagine nell'applicazione MAUI per Android

Categoria del blog: Barcode.NETAndroid

08.05.2024

Questo articolo spiega come creare un'applicazione MAUI, caricare un'immagine dalla galleria immagini e riconoscere i codici a barre nelle immagini in Android. Per il riconoscimento dei codici a barre viene utilizzato VintaSoft Barcode .NET SDK.

Ecco i passaggi da seguire:
  1. Crea un'applicazione MAUI vuota.
    Apri Visual Studio .NET 2022 e crea un nuovo progetto di tipo Applicazione MAUI .NET:

    Configura il progetto per utilizzare .NET 8.0:

  2. Specifica che l'applicazione MAUI verrà utilizzata in Android.
    Apri il file di progetto e seleziona i framework di destinazione: Android.

  3. Aggiunge un riferimento al pacchetto nuget Vintasoft Barcode all'applicazione MAUI.
    Aggiunge un riferimento a Vintasoft.Barcode nuget-package all'applicazione MAUI.

  4. Specifica che il compilatore .NET non debba ridurre/minimizzare gli assembly Vintasoft e Mono.Android.
    Apri il file di progetto MAUI e aggiungi elementi di progetto che consentono di specificare che il compilatore .NET non debba ridurre/minimizzare gli assembly Vintasoft e Mono.Android se gli assembly .NET dell'applicazione MAUI devono essere ridotti/minimizzati.


    Ecco gli elementi del progetto che consentono di specificare che il compilatore .NET non deve tagliare/minimizzare gli assembly Vintasoft e Mono.Android se gli assembly .NET dell'applicazione MAUI devono essere tagliati/minimizzati:
    <ItemGroup>
        <TrimmerRootAssembly Include="Vintasoft.Barcode" RootMode="library" />
        <TrimmerRootAssembly Include="Vintasoft.Shared" RootMode="library" />
        <TrimmerRootAssembly Include="Mono.Android" RootMode="library" />
    </ItemGroup>
    
  5. Aggiungi un controllo dell'interfaccia utente per visualizzare l'immagine aperta, un pulsante per aprire l'immagine dalla galleria immagini, un pulsante per riconoscere i codici a barre nell'immagine aperta.
    Apri il layout XAML della pagina principale nel file "MainPage.xaml" e aggiungi un controllo dell'interfaccia utente per visualizzare l'immagine aperta, un pulsante per aprire l'immagine dalla galleria immagini, un pulsante per riconoscere i codici a barre nell'immagine aperta.


    Ecco il codice XAML della pagina principale (la pagina contiene un controllo dell'interfaccia utente per visualizzare l'immagine aperta, un pulsante per aprire l'immagine dalla galleria immagini, un pulsante per riconoscere i codici a barre nell'immagine aperta):
    <?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. Aggiungi codice C# che registra la versione di valutazione per VintaSoft Barcode .NET SDK.
    Ottieni il codice C# per utilizzare la versione di valutazione in Android seguendo il metodo descritto in documentazione e inserire il codice ottenuto nel codice C# del file "MainPage.xaml.cs".


    Ecco il codice C# che registra la versione di valutazione per 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. Aggiungi il codice C# che apre l'immagine dalla galleria immagini e riconosce i codici a barre nell'immagine aperta.
    Apri il file "MainPage.xaml.cs" e aggiungi il codice C#, che apre l'immagine dalla galleria immagini, al metodo openBarcodeButton_Clicked.
    Apri il file "MainPage.xaml.cs" e aggiungi il codice C#, che riconosce i codici a barre nell'immagine aperta, al metodo recognizeBarcodeButton_Clicked.


    Ecco il codice C# che apre l'immagine dalla galleria immagini e riconosce i codici a barre nell'immagine aperta:
    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. Firma l'assembly dell'applicazione MAUI utilizzando un file con nome sicuro.
    Se disponi di un file con nome sicuro, firma l'assembly dell'applicazione MAUI utilizzando un file con nome sicuro.


    Se non disponi di un file con nome sicuro, leggi come generare un file con nome sicuro qui.
  9. Esegui l'applicazione MAUI nell'emulatore Android e guarda il risultato.