Сканирование штрих -кода не работает с Google Mlkit в .net Android 8.0C#

Место общения программистов C#
Ответить
Anonymous
 Сканирование штрих -кода не работает с Google Mlkit в .net Android 8.0

Сообщение Anonymous »

У меня есть приложение, в котором я использую Google Mlkit для сканирования штрих -кода, но оно всегда говорит о не обнаруженном штрих -коде.

Код: Выделить всё

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;

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
(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 barcodes = await _barcodeScanner.Process(inputImage) as IList;

if (barcodes is IList 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();
}
}

}
}
Что я могу попробовать дальше?


Подробнее здесь: https://stackoverflow.com/questions/795 ... ndroid-8-0
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»