Skip to content

Commit fca72c2

Browse files
committed
2.1.2
1 parent c87a1ec commit fca72c2

File tree

4 files changed

+73
-104
lines changed

4 files changed

+73
-104
lines changed

BarcodeScanning.Native.Maui/BarcodeScanning.Native.Maui.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
1111
<IsAotCompatible>true</IsAotCompatible>
1212
<Nullable>enable</Nullable>
13-
<Version>2.1.1</Version>
13+
<Version>2.1.2</Version>
1414
<Authors>Alen Friščić</Authors>
1515
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1616
<PackageReadmeFile>README.md</PackageReadmeFile>

BarcodeScanning.Native.Maui/Platform/Android/BarcodeAnalyzer.cs

Lines changed: 52 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
using Xamarin.Google.MLKit.Vision.BarCode;
1010
using Xamarin.Google.MLKit.Vision.Common;
1111

12-
using MLKitBarcodeScanning = Xamarin.Google.MLKit.Vision.BarCode.BarcodeScanning;
1312
using Point = Microsoft.Maui.Graphics.Point;
1413
using Rect = Microsoft.Maui.Graphics.Rect;
14+
using Scanner = Xamarin.Google.MLKit.Vision.BarCode.BarcodeScanning;
1515
using Size = Android.Util.Size;
1616

1717
namespace BarcodeScanning;
1818

19-
internal class BarcodeAnalyzer : Java.Lang.Object, ImageAnalysis.IAnalyzer, IOnSuccessListener, IOnCompleteListener
19+
internal class BarcodeAnalyzer : Java.Lang.Object, ImageAnalysis.IAnalyzer
2020
{
2121
public Size DefaultTargetResolution => Methods.TargetResolution(null);
2222
public int TargetCoordinateSystem => ImageAnalysis.CoordinateSystemViewReferenced;
@@ -27,9 +27,7 @@ internal class BarcodeAnalyzer : Java.Lang.Object, ImageAnalysis.IAnalyzer, IOnS
2727

2828
private IBarcodeScanner? _barcodeScanner;
2929
private CoordinateTransform? _coordinateTransform;
30-
private IImageProxy? _proxy;
3130

32-
private bool _processInverted = false;
3331
private bool _updateCoordinateTransform = false;
3432
private int _transformDegrees = 0;
3533
private Point _previewViewCenter = new();
@@ -43,50 +41,39 @@ internal BarcodeAnalyzer(CameraManager cameraManager)
4341

4442
_previewViewRect.X = 0;
4543
_previewViewRect.Y = 0;
46-
47-
UpdateSymbologies();
4844
}
4945

5046
internal void UpdateSymbologies()
5147
{
52-
if (_cameraManager?.CameraView is not null)
53-
{
54-
_barcodeScanner?.Dispose();
55-
_barcodeScanner = MLKitBarcodeScanning.GetClient(new BarcodeScannerOptions.Builder()
56-
.SetBarcodeFormats(Methods.ConvertBarcodeFormats(_cameraManager.CameraView.BarcodeSymbologies))
57-
.Build());
58-
}
48+
_barcodeScanner?.Dispose();
49+
_barcodeScanner = Scanner.GetClient(new BarcodeScannerOptions.Builder()
50+
.SetBarcodeFormats(Methods.ConvertBarcodeFormats(_cameraManager?.CameraView?.BarcodeSymbologies ?? BarcodeFormats.All))
51+
.Build());
5952
}
6053

6154
public void Analyze(IImageProxy proxy)
6255
{
63-
_proxy = proxy;
64-
6556
try
6657
{
67-
ArgumentNullException.ThrowIfNull(_proxy?.Image);
58+
ArgumentNullException.ThrowIfNull(proxy?.Image);
6859
ArgumentNullException.ThrowIfNull(_cameraManager?.CameraView);
6960
ArgumentNullException.ThrowIfNull(_barcodeScanner);
7061

71-
_processInverted = _cameraManager.CameraView.ForceInverted;
72-
7362
if (_cameraManager.CameraView.PauseScanning)
74-
{
75-
CloseProxy();
7663
return;
77-
}
7864

7965
if (_cameraManager.CameraView.CaptureNextFrame)
8066
{
8167
_cameraManager.CameraView.CaptureNextFrame = false;
82-
var image = new PlatformImage(_proxy.ToBitmap());
68+
var image = new PlatformImage(proxy.ToBitmap());
8369
_cameraManager.CameraView.TriggerOnImageCaptured(image);
8470
}
8571

86-
if (_updateCoordinateTransform || _transformDegrees != _proxy.ImageInfo.RotationDegrees)
72+
if (_updateCoordinateTransform || _transformDegrees != proxy.ImageInfo.RotationDegrees)
8773
{
88-
_coordinateTransform = _cameraManager.GetCoordinateTransform(_proxy);
89-
_transformDegrees = _proxy.ImageInfo.RotationDegrees;
74+
_coordinateTransform?.Dispose();
75+
_coordinateTransform = _cameraManager.GetCoordinateTransform(proxy);
76+
_transformDegrees = proxy.ImageInfo.RotationDegrees;
9077

9178
_previewViewCenter.X = _cameraManager.PreviewView.Width / 2;
9279
_previewViewCenter.Y = _cameraManager.PreviewView.Height / 2;
@@ -96,92 +83,69 @@ public void Analyze(IImageProxy proxy)
9683
_updateCoordinateTransform = false;
9784
}
9885

99-
using var inputImage = InputImage.FromMediaImage(_proxy.Image, _proxy.ImageInfo.RotationDegrees);
100-
_barcodeScanner.Process(inputImage).AddOnSuccessListener(this).AddOnCompleteListener(this);
101-
}
102-
catch (Exception ex)
103-
{
104-
Debug.WriteLine(ex);
105-
CloseProxy();
106-
}
107-
}
86+
using var inputImage = InputImage.FromMediaImage(proxy.Image, proxy.ImageInfo.RotationDegrees);
87+
using var task = _barcodeScanner.Process(inputImage);
88+
var result = TasksClass.Await(task);
89+
90+
Java.Lang.Object? invertedResult = null;
91+
if (_cameraManager.CameraView.ForceInverted)
92+
{
93+
Methods.InvertLuminance(proxy.Image);
94+
using var invertedImage = InputImage.FromMediaImage(proxy.Image, proxy.ImageInfo.RotationDegrees);
95+
using var invertedTask = _barcodeScanner.Process(invertedImage);
96+
invertedResult = TasksClass.Await(invertedTask);
97+
}
10898

109-
public void OnSuccess(Java.Lang.Object? result)
110-
{
111-
try
112-
{
11399
lock (_resultsLock)
114100
{
115-
if (_processInverted == _cameraManager?.CameraView?.ForceInverted)
116-
_barcodeResults.Clear();
117-
118-
if (result is not JavaList javaList)
119-
return;
120-
121-
foreach (Barcode barcode in javaList)
122-
{
123-
if (barcode is null)
124-
continue;
125-
if (string.IsNullOrEmpty(barcode.DisplayValue) && string.IsNullOrEmpty(barcode.RawValue))
126-
continue;
127-
128-
var barcodeResult = barcode.AsBarcodeResult(_coordinateTransform);
129-
130-
if ((_cameraManager?.CameraView?.AimMode ?? false) && !barcodeResult.PreviewBoundingBox.Contains(_previewViewCenter))
131-
continue;
132-
if ((_cameraManager?.CameraView?.ViewfinderMode ?? false) && !_previewViewRect.Contains(barcodeResult.PreviewBoundingBox))
133-
continue;
134-
135-
_barcodeResults.Add(barcodeResult);
136-
}
101+
_barcodeResults.Clear();
102+
AddResultToSet(result);
103+
AddResultToSet(invertedResult);
104+
105+
result?.Dispose();
106+
invertedResult?.Dispose();
137107
}
138108

139-
if (!_processInverted)
140-
_cameraManager?.CameraView?.DetectionFinished(_barcodeResults, _resultsLock);
109+
_cameraManager?.CameraView?.DetectionFinished(_barcodeResults, _resultsLock);
141110
}
142111
catch (Exception ex)
143112
{
144113
Debug.WriteLine(ex);
145114
}
146-
}
147-
148-
public void OnComplete(Android.Gms.Tasks.Task task)
149-
{
150-
if (_processInverted)
115+
finally
151116
{
152117
try
153118
{
154-
_processInverted = false;
155-
156-
ArgumentNullException.ThrowIfNull(_proxy?.Image);
157-
ArgumentNullException.ThrowIfNull(_barcodeScanner);
158-
159-
Methods.InvertLuminance(_proxy.Image);
160-
using var inputImage = InputImage.FromMediaImage(_proxy.Image, _proxy.ImageInfo.RotationDegrees);
161-
_barcodeScanner.Process(inputImage).AddOnSuccessListener(this).AddOnCompleteListener(this);
119+
proxy?.Close();
162120
}
163121
catch (Exception ex)
164122
{
165123
Debug.WriteLine(ex);
166-
CloseProxy();
124+
MainThread.BeginInvokeOnMainThread(() => _cameraManager?.Start());
167125
}
168126
}
169-
else
170-
{
171-
CloseProxy();
172-
}
173127
}
174128

175-
private void CloseProxy()
129+
private void AddResultToSet(Java.Lang.Object? result)
176130
{
177-
try
178-
{
179-
_proxy?.Close();
180-
}
181-
catch (Exception ex)
131+
if (result is not JavaList javaList)
132+
return;
133+
134+
foreach (Barcode barcode in javaList)
182135
{
183-
Debug.WriteLine(ex);
184-
MainThread.BeginInvokeOnMainThread(() => _cameraManager?.Start());
136+
if (barcode is null)
137+
continue;
138+
if (string.IsNullOrEmpty(barcode.DisplayValue) && string.IsNullOrEmpty(barcode.RawValue))
139+
continue;
140+
141+
var barcodeResult = barcode.AsBarcodeResult(_coordinateTransform);
142+
143+
if ((_cameraManager?.CameraView?.AimMode ?? false) && !barcodeResult.PreviewBoundingBox.Contains(_previewViewCenter))
144+
continue;
145+
if ((_cameraManager?.CameraView?.ViewfinderMode ?? false) && !_previewViewRect.Contains(barcodeResult.PreviewBoundingBox))
146+
continue;
147+
148+
_barcodeResults.Add(barcodeResult);
185149
}
186150
}
187151

BarcodeScanning.Native.Maui/Platform/Android/CameraManager.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ internal class CameraManager : IDisposable
2828
private readonly BarcodeAnalyzer _barcodeAnalyzer;
2929
private readonly BarcodeView _barcodeView;
3030
private readonly Context _context;
31-
private readonly IExecutorService _cameraExecutor;
31+
private readonly IExecutorService _analyzerExecutor;
3232
private readonly ImageView _imageView;
3333
private readonly LifecycleCameraController _cameraController;
3434
private readonly ILifecycleOwner _lifecycleOwner;
@@ -60,7 +60,7 @@ internal CameraManager(CameraView cameraView, Context context)
6060
ArgumentNullException.ThrowIfNull(owner);
6161
ArgumentNullException.ThrowIfNull(executor);
6262
_lifecycleOwner = owner;
63-
_cameraExecutor = executor;
63+
_analyzerExecutor = executor;
6464

6565
_barcodeAnalyzer = new BarcodeAnalyzer(this);
6666

@@ -126,9 +126,10 @@ internal void Start()
126126
{
127127
if (OpenedCameraState?.GetType() != CameraState.Type.Closed)
128128
_cameraController.Unbind();
129-
130-
if (_barcodeAnalyzer is not null && _cameraExecutor is not null)
131-
_cameraController.SetImageAnalysisAnalyzer(_cameraExecutor, _barcodeAnalyzer);
129+
130+
_cameraController.ClearImageAnalysisAnalyzer();
131+
if (_barcodeAnalyzer is not null && _analyzerExecutor is not null)
132+
_cameraController.SetImageAnalysisAnalyzer(_analyzerExecutor, _barcodeAnalyzer);
132133

133134
UpdateResolution();
134135
UpdateCamera();
@@ -269,6 +270,8 @@ protected virtual void Dispose(bool disposing)
269270
_currentCameraInfo?.CameraState.RemoveObserver(_cameraStateObserver);
270271
}
271272

273+
_cameraController?.ClearImageAnalysisAnalyzer();
274+
272275
_barcodeView?.RemoveAllViews();
273276
_relativeLayout?.RemoveAllViews();
274277

@@ -280,7 +283,7 @@ protected virtual void Dispose(bool disposing)
280283
_currentCameraInfo?.Dispose();
281284
_cameraStateObserver?.Dispose();
282285
_barcodeAnalyzer?.Dispose();
283-
_cameraExecutor?.Dispose();
286+
_analyzerExecutor?.Dispose();
284287
}
285288
}
286289
}

BarcodeScanning.Native.Maui/Platform/MaciOS/BarcodeAnalyzer.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,20 @@ internal BarcodeAnalyzer(CameraManager cameraManager)
4141

4242
internal void UpdateSymbologies()
4343
{
44-
if (_cameraManager?.CameraView is not null)
45-
_detectBarcodesRequest.Symbologies = Methods.SelectedSymbologies(_cameraManager.CameraView.BarcodeSymbologies);
44+
_detectBarcodesRequest.Symbologies = Methods.SelectedSymbologies(_cameraManager?.CameraView?.BarcodeSymbologies ?? BarcodeFormats.All);
4645
}
4746

4847
public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection)
4948
{
5049
try
5150
{
52-
if (_cameraManager?.CameraView?.PauseScanning ?? false)
51+
ArgumentNullException.ThrowIfNull(_cameraManager?.CameraView);
52+
ArgumentNullException.ThrowIfNull(sampleBuffer);
53+
54+
if (_cameraManager.CameraView.PauseScanning)
5355
return;
5456

55-
if (_cameraManager?.CameraView?.CaptureNextFrame ?? false)
57+
if (_cameraManager.CameraView.CaptureNextFrame)
5658
{
5759
_cameraManager.CameraView.CaptureNextFrame = false;
5860
using var imageBuffer = sampleBuffer.GetImageBuffer();
@@ -69,7 +71,7 @@ public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSamp
6971
}
7072
}
7173

72-
_sequenceRequestHandler?.Perform([_detectBarcodesRequest], sampleBuffer, out _);
74+
_sequenceRequestHandler.Perform([_detectBarcodesRequest], sampleBuffer, out _);
7375

7476
lock (_resultsLock)
7577
{
@@ -79,9 +81,9 @@ public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSamp
7981
if (string.IsNullOrEmpty(barcode.PayloadStringValue))
8082
continue;
8183

82-
var barcodeResult = barcode.AsBarcodeResult(_cameraManager?.PreviewLayer);
84+
var barcodeResult = barcode.AsBarcodeResult(_cameraManager.PreviewLayer);
8385

84-
if (_cameraManager?.CameraView?.AimMode ?? false)
86+
if (_cameraManager.CameraView.AimMode)
8587
{
8688
_previewCenter.X = _cameraManager.PreviewLayer.Bounds.GetMidX();
8789
_previewCenter.Y = _cameraManager.PreviewLayer.Bounds.GetMidY();
@@ -90,7 +92,7 @@ public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSamp
9092
continue;
9193
}
9294

93-
if (_cameraManager?.CameraView?.ViewfinderMode ?? false)
95+
if (_cameraManager.CameraView.ViewfinderMode)
9496
{
9597
_previewRect.Width = _cameraManager.PreviewLayer.Bounds.Width;
9698
_previewRect.Height = _cameraManager.PreviewLayer.Bounds.Height;
@@ -103,7 +105,7 @@ public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSamp
103105
}
104106
}
105107

106-
_cameraManager?.CameraView?.DetectionFinished(_barcodeResults, _resultsLock);
108+
_cameraManager.CameraView.DetectionFinished(_barcodeResults, _resultsLock);
107109
}
108110
catch (Exception ex)
109111
{

0 commit comments

Comments
 (0)