Android -Kamera -Vorschau, die für die MLKit -Barcode -Analyse auf MAUI Custom Control nicht rendertC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Android -Kamera -Vorschau, die für die MLKit -Barcode -Analyse auf MAUI Custom Control nicht rendert

Post by Anonymous »

Ich habe einen QR -Code, der seit Zxing.Maui über Googles ML -Kit für Android gelesen wird. Ich folgte dem Code in ML-Kit/Vision/Barcode-Scanning/Android und VinayByte/Mlkit-Qr-Code-Scan-Android-Kotlin und auch Hjam40/camera.maui Ich konnte keine Kamera verwenden. Für .NET 9 < /p>
Hier ist mein benutzerdefinierter Kontrollcode. Wenn jemand eine Idee hat, warum die Vorschau nicht angezeigt wird, wäre dies eine große Hilfe! < /p>
< pre class = "Lang-cs PrettyPrint-Override">

Code: Select all

builder.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler();
});
< /code>
Benutzerdefinierte Steuerung < /p>
public class QRCodeReaderView : View {}
< /code>
public partial class QRCodeReaderViewHandler
{
public static IPropertyMapper PropertyMapper = new PropertyMapper(ViewMapper)
{

};

public static CommandMapper  CommandMapper = new CommandMapper(ViewCommandMapper)
{
};

public QRCodeReaderViewHandler() : base(PropertyMapper, CommandMapper) { }
}
< /code>
using System.Diagnostics;
using AndroidX.Camera.Core;
using AndroidX.Camera.Core.ResolutionSelector;
using AndroidX.Camera.Lifecycle;
using AndroidX.Camera.View;
using AndroidX.Core.Content;
using AndroidX.Lifecycle;
using Java.Lang;
using Java.Util.Concurrent;
using Microsoft.Maui.Handlers;
using Exception = System.Exception;
using Size = Android.Util.Size;

namespace QRCodeScanner;

public partial class QRCodeReaderViewHandler : ViewHandler
{
private Preview? _cameraPreview;
private PreviewView _previewView;
private IExecutorService? cameraExecutor;
private ICamera? _camera;

protected override AndroidQRCodeReaderView CreatePlatformView()
{
var context = MauiContext?.Context ?? Platform.AppContext;
_previewView = new PreviewView(context);
return new AndroidQRCodeReaderView(context, _previewView);
}

protected override void ConnectHandler(AndroidQRCodeReaderView platformView)
{
base.ConnectHandler(platformView);
if (MauiContext is not null)
{
Connect(MauiContext, platformView.PreviewView);
}

}

public void Connect(IMauiContext mauiContext, PreviewView previewView)
{
try
{
if (mauiContext.Context is null)
{
return;
}
cameraExecutor = Executors.NewSingleThreadExecutor();
var cameraProviderFuture = ProcessCameraProvider.GetInstance(mauiContext.Context);
if (cameraExecutor is null)
return;
var cameraProvider = cameraProviderFuture.Get() as ProcessCameraProvider;
if (cameraProvider is null)
return;
cameraProviderFuture.AddListener(new Runnable(() =>
{

var resolutionSelector = new ResolutionSelector.Builder().SetResolutionStrategy(new ResolutionStrategy(boundSize: new Size(1280, 700),
fallbackRule: ResolutionStrategy.FallbackRuleClosestHigherThenLower))
.Build();

_cameraPreview = new Preview.Builder().SetResolutionSelector(resolutionSelector).Build();
_cameraPreview.SetSurfaceProvider(cameraExecutor, previewView.SurfaceProvider);

var imageAnalyzer = new ImageAnalysis.Builder()
.SetBackpressureStrategy(ImageAnalysis.StrategyKeepOnlyLatest)
.SetResolutionSelector(resolutionSelector)
.Build();
var mLkitQrCodeAnalyzer = new MLkitQRCodeAnalyzer();
imageAnalyzer.SetAnalyzer(cameraExecutor, mLkitQrCodeAnalyzer);
cameraProvider.UnbindAll();
var cameraSelector = CameraSelector.DefaultBackCamera;
var hasCamera = cameraProvider.HasCamera(cameraSelector);
Debug.WriteLine($"hasCamera:  {hasCamera}");
if (previewView.Context is ILifecycleOwner lifecycleOwner)
{
_camera = cameraProvider.BindToLifecycle(lifecycleOwner, cameraSelector, _cameraPreview, imageAnalyzer);
}
else if (Platform.CurrentActivity is ILifecycleOwner maLifecycleOwner)
{
_camera = cameraProvider.BindToLifecycle(maLifecycleOwner, cameraSelector, _cameraPreview, imageAnalyzer);
}
}),
ContextCompat.GetMainExecutor(mauiContext.Context));
}
catch (Exception ex)
{
Debug.WriteLine(ex.StackTrace);
}
}
}

< /code>
Kamera berechtigt

Code: Select all

private async Task CheckAndRequestCameraPermission()
{
var status = await Permissions.CheckStatusAsync();
if (status != PermissionStatus.Granted)
{
status = await Permissions.RequestAsync();
if (status != PermissionStatus.Granted)
{
await DisplayAlert("Camera Permission Denied", "This app needs access to the camera to scan QR codes.", "OK");
}
}
}

protected override async void OnAppearing()
{
base.OnAppearing();
await CheckAndRequestCameraPermission();
}
< /code>
Ui < /p>















screenshot
< /p>
Bearbeiten: < /h3>
Auf der weiteren Analyse über LogCat fand ich das Problem wie folgt < /p>

Code: Select all

Unable to configure camera Camera@461d7c2[id=0]
java.util.concurrent.TimeoutException: Future[androidx.camera.core.impl.utils.futures.ListFuture@4c0973e] is not done within 5000 ms.
Die mögliche Lösung zum Setzen von Android: HardWareAccelerated = "True" Anwendungsstufe oder MainActivity -Ebene funktioniert auch nicht.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post