Предварительный просмотр камеры Android не рендеринг для анализа штрих -кода MLKIT на пользовательском управлении MAUIAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Предварительный просмотр камеры Android не рендеринг для анализа штрих -кода MLKIT на пользовательском управлении MAUI

Сообщение Anonymous »

У меня есть QR -код, который должен прочитать набор Google ML для Android, так как ZXING.MAUI не читает его. Я следил за кодом в ml-kit/vision/sarcode-scanning/android и vinaybyte/mlkit-qr-code-scan-android-kotlin, а также Hjam40/Camera.maui Я не смог использовать Camera.maui, так как она не работает Для .net 9 < /p>
Вот мой пользовательский код управления, если у кого -то есть идея, почему предварительный просмотр не отображается, это было бы отличной помощью! < /p>
< Pre Class = "Lang-CS PrettyPrint-Override">

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

builder.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler();
});
< /code>
Custom Control < /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>
разрешения камеры

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

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>
Изменить: при дальнейшем анализе через logcat я обнаружил, что проблема следующей < /p>

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

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.
Возможное решение для установки Android: HardwareAccelerated = "true" Уровень приложения или уровень магистратуры тоже не работает.


Подробнее здесь: https://stackoverflow.com/questions/794 ... custom-con
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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