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?