У меня есть приложение, в котором я использую Google Mlkit для сканирования штрих -кода, но оно всегда говорит о не обнаруженном штрих -коде.[code]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 { protected override int FragmentId => Resource.Layout.fragment_barcode_scan;
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);
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();