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>
< /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.