最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - Barcode Scanning Not working with Google MLKit in .Net Android 8.0 - Stack Overflow

programmeradmin3浏览0评论

I am having an app in Which I am using Google MLKit for Barcode Scanning but it always says No Barcode detected.

Added the permissions and Frameworks but No Barcode Detected.

using System;
using System.Threading.Tasks;
using Android.OS;
using Android.Runtime;
using Android.Views;
using AndroidX.Camera.Core;
using AndroidX.Camera.Lifecycle;
using AndroidX.Camera.View;
using AndroidX.Core.Content;
using Google.Android.Material.Snackbar;
using Xamarin.Google.MLKit.Vision;
using Xamarin.Google.MLKit.Vision.Barcode;
using Xamarin.Google.MLKit.Vision.Common;
using Java.Util.Concurrent;
using Exception = System.Exception;
using Leslies.Core.ViewModels.Cells;
using Leslies.Droid.Views.Base;
using Xamarin.Google.MLKit.Vision.BarCode;
using Android.Gms.Extensions;
using Android.Gms.Vision.Barcodes;
using Android.Util;
using Android.Graphics;
using Java.Util.Concurrent;
namespace Test.Droid.Views.Shop
{
    [Register(nameof(BarcodeScanFragment))]
    public class BarcodeScanFragment : BaseRecyclerViewFragment<BarcodeScanningViewModel>
    {
        protected override int FragmentId => Resource.Layout.fragment_barcode_scan;

        private PreviewView previewView;
        private ProcessCameraProvider cameraProvider;
        private IBarcodeScanner barcodeScanner;
        private ImageAnalysis imageAnalysis;
        private Camera camera;
        private bool isCameraInitialized = false;


        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            return inflater.Inflate(Resource.Layout.fragment_barcode_scan, container, false);
        }

        public override void OnViewCreated(View view, Bundle savedInstanceState)
        {
            base.OnViewCreated(view, savedInstanceState);
            previewView = view.FindViewById<PreviewView>(Resource.Id.previewView);


            //var options = new BarcodeScannerOptions.Builder().Build();
            var options = new BarcodeScannerOptions.Builder()
        .SetBarcodeFormats(
            1,    // QR_CODE
            4,    // CODE_128
            32,   // EAN_13
            64,   // EAN_8
            256,  // UPC_A
            512,   // UPC_E
            2048
        )
        .Build();


            barcodeScanner = BarcodeScanning.GetClient(options);

            RequestPermissions(new string[] { Android.Manifest.Permission.Camera }, 1001);

        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
        {
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == 1001 && grantResults.Length > 0 && grantResults[0] == Android.Content.PM.Permission.Granted)
            {
                StartCamera();
            }
        }


        public override void OnResume()
        {
            base.OnResume();
            if (!isCameraInitialized)
            {
                StartCamera();
            }
        }

        public override void OnPause()
        {
            base.OnPause();
            cameraProvider?.UnbindAll();
            isCameraInitialized = false;
        }

        private async void StartCamera()
        {

            if (cameraProvider != null)
            {
                cameraProvider.UnbindAll();
            }


            var cameraProviderFuture = ProcessCameraProvider.GetInstance(Context);
            cameraProvider = (ProcessCameraProvider)await cameraProviderFuture.GetAsync();

            var cameraSelector = new CameraSelector.Builder()
                .RequireLensFacing(CameraSelector.LensFacingBack)
                .Build();

            var preview = new Preview.Builder()
    .SetTargetResolution(new Size(1280, 720)) // Adjust for better detection
    .Build();
            var executor = ContextCompat.GetMainExecutor(Context);
            var surfaceProvider = previewView.SurfaceProvider;

            if (surfaceProvider == null)
            {
                Console.WriteLine("Surface provider is null");
            }

            if (surfaceProvider != null)
            {
                preview.SetSurfaceProvider(executor, surfaceProvider);
            }

            var imageAnalysis = new ImageAnalysis.Builder()
    .SetTargetResolution(new Size(1280, 720)) // Lower resolution
    .SetBackpressureStrategy(ImageAnalysis.StrategyKeepOnlyLatest) // Prevent overload
    .SetOutputImageFormat(ImageAnalysis.OutputImageFormatYuv420888) // Ensure correct format
    .Build();


            imageAnalysis.SetAnalyzer(executor, new BarcodeAnalyzer(barcodeScanner));
            cameraProvider.UnbindAll();
            cameraProvider.BindToLifecycle(this, cameraSelector, preview, imageAnalysis);

            isCameraInitialized = true;
            Console.WriteLine("Camera initialized successfully.");
        }
    }

    public class BarcodeAnalyzer : Java.Lang.Object, ImageAnalysis.IAnalyzer
    {
        private readonly IBarcodeScanner _barcodeScanner;

        public BarcodeAnalyzer(IBarcodeScanner barcodeScanner)
        {
            _barcodeScanner = barcodeScanner;
            Console.WriteLine("BarcodeAnalyzer initialized");
        }

        private Bitmap ConvertYUVToRGB(IImageProxy image)
        {
            var yBuffer = image.GetPlanes()[0].Buffer;
            var uBuffer = image.GetPlanes()[1].Buffer;
            var vBuffer = image.GetPlanes()[2].Buffer;

            int width = image.Width;
            int height = image.Height;

            var yuvBytes = new byte[yBuffer.Remaining() + uBuffer.Remaining() + vBuffer.Remaining()];
            yBuffer.Get(yuvBytes, 0, yBuffer.Remaining());
            uBuffer.Get(yuvBytes, yBuffer.Remaining(), uBuffer.Remaining());
            vBuffer.Get(yuvBytes, yBuffer.Remaining() + uBuffer.Remaining(), vBuffer.Remaining());

            var yuvImage = new YuvImage(yuvBytes, ImageFormatType.Nv21, width, height, null);
            var outStream = new MemoryStream();
            yuvImage.CompressToJpeg(new Rect(0, 0, width, height), 100, outStream);
            var jpegBytes = outStream.ToArray();

            return BitmapFactory.DecodeByteArray(jpegBytes, 0, jpegBytes.Length);
        }


        public async void Analyze(IImageProxy image)
        {
            try
            {
                var mediaImage = image.Image;
                if (mediaImage == null)
                {
                    Console.WriteLine("Media image is null");
                    image.Close();
                    return;
                }

                //Console.WriteLine($"Analyzing image... Rotation: {image.ImageInfo.RotationDegrees}");

                //var bitmap = Bitmap.CreateBitmap(image.Width, image.Height, Bitmap.Config.Argb8888);
                //Console.WriteLine($"Captured Image: Width={bitmap.Width}, Height={bitmap.Height}");

                int rotation = image.ImageInfo.RotationDegrees;
                if (rotation == 90 || rotation == 270)
                {
                    rotation = 0; // Normalize to prevent issues
                }

                Console.WriteLine($"Analyzing image... Rotation: {rotation}");

                //var inputImage = InputImage.FromMediaImage(mediaImage, rotation);

                //var bitmap = ConvertYUVToRGB(image);
                //var inputImage = InputImage.FromBitmap(bitmap, rotation);

                var inputImage = InputImage.FromMediaImage(mediaImage, rotation);


                IList<Barcode> barcodes = await _barcodeScanner.Process(inputImage) as IList<Barcode>;

                if (barcodes is IList<Barcode> barcodeList && barcodeList.Count > 0)
                {
                    Console.WriteLine($"Processed barcodes count: {barcodeList.Count}");
                }
                else
                {
                    Console.WriteLine("No barcodes found");
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine($"Barcode scanning failed: {ex.Message}");
            }
            finally
            {
                image.Close();
            }
        }

    }
}

Can anyone please help?

发布评论

评论列表(0)

  1. 暂无评论