Synergit.Maui.Camera
0.7.0-beta
See the version list below for details.
dotnet add package Synergit.Maui.Camera --version 0.7.0-beta
NuGet\Install-Package Synergit.Maui.Camera -Version 0.7.0-beta
<PackageReference Include="Synergit.Maui.Camera" Version="0.7.0-beta" />
paket add Synergit.Maui.Camera --version 0.7.0-beta
#r "nuget: Synergit.Maui.Camera, 0.7.0-beta"
// Install Synergit.Maui.Camera as a Cake Addin #addin nuget:?package=Synergit.Maui.Camera&version=0.7.0-beta&prerelease // Install Synergit.Maui.Camera as a Cake Tool #tool nuget:?package=Synergit.Maui.Camera&version=0.7.0-beta&prerelease
Camera.MAUI
A Camera View control and a Barcode Encode/Decode control (based on ZXing.Net) for .NET MAUI applications. This project was based on hjam40 project <a href="https://github.com/hjam40/Camera.MAUI" target="_blank">Camera.MAUI</a>. Our company needed to convert this component to .NET 8, modify some of its behaviors and add another functions primarily focused on taking photos.
CameraView
A ContentView control for camera management with the next properties:
Android | iOS/Mac | Windows | |
---|---|---|---|
Preview | ✅ | ✅ | ✅ |
Mirror preview | ✅ | ✅ | ✅ |
Flash | ✅ | ✅ | ✅ |
Torch | ✅ | ✅ | ✅ |
Zoom | ✅ | ✅ | ✅ |
Take snapshot | ✅ | ✅ | ✅ |
Save snapshot | ✅ | ✅ | ✅ |
Barcode detection/decode | ✅ | ✅ | ✅ |
Video/audio recording | ✅ | ✅ | ✅ |
Take Photo | ✅ | ✅ | ✅ |
Install and configure CameraView
Download and Install Synergit.Maui.Camera NuGet package on your application.
Initialize the plugin in your
MauiProgram.cs
:// Add the using to the top using Camera.MAUI; public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .UseSynergitCamera(); // Add the use of the plugging return builder.Build(); }
Add camera/microphone permissions to your application:
Android
In your AndroidManifest.xml
file (Platforms\Android) add the following permission:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
iOS/MacCatalyst
In your info.plist
file (Platforms\iOS / Platforms\MacCatalyst) add the following permission:
<key>NSCameraUsageDescription</key>
<string>This app uses camera for...</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app needs access to the microphone for record videos</string>
Make sure that you enter a clear and valid reason for your app to access the camera. This description will be shown to the user.
Windows
In your Package.appxmanifest file (Platforms\Windows) go to Capabilities and mark Web Camera and Microphone.
For more information on permissions, see the Microsoft Docs.
Using CameraView
In XAML, make sure to add the right XML namespace:
xmlns:sgmc="clr-namespace:Synergit.Maui.Camera;assembly=Synergit.Maui.Camera"
Use the control:
<sgmc:CameraView x:Name="cameraView" WidthRequest="200" HeightRequest="300"/>
Configure the events:
cameraView.CamerasLoaded += CameraView_CamerasLoaded;
cameraView.BarcodeDetected += CameraView_BarcodeDetected;
Configure the camera and microphone to use:
private void CameraView_CamerasLoaded(object sender, EventArgs e)
{
if (cameraView.NumCamerasDetected > 0)
{
if (cameraView.NumMicrophonesDetected > 0)
cameraView.Microphone = cameraView.Microphones.First();
cameraView.Camera = cameraView.Cameras.First();
MainThread.BeginInvokeOnMainThread(async () =>
{
if (await cameraView.StartCameraAsync() == CameraResult.Success)
{
controlButton.Text = "Stop";
playing = true;
}
});
}
}
CameraInfo type (Camera Property): CameraInfo has the next properties:
public string Name
public string DeviceId
public CameraPosition Position
public bool HasFlashUnit
public float MinZoomFactor
public float MaxZoomFactor
public List<Size> AvailableResolutions
Start camera playback:
if (await cameraView.StartCameraAsync(new Size(1280, 720)) == CameraResult.Success)
{
playing = true;
}
Stop camera playback:
if (await cameraView.StopCameraAsync() == CameraResult.Success)
{
playing = false;
}
Set Flash mode
cameraView.FlashMode = FlashMode.Auto;
Toggle Torch
cameraView.TorchEnabled = !cameraView.TorchEnabled;
Set mirrored mode
cameraView.MirroredImage = true;
Set zoom factor
if (cameraView.MaxZoomFactor >= 2.5f)
cameraView.ZoomFactor = 2.5f;
Get a snapshot from the playback
ImageSource imageSource = cameraView.GetSnapShot(ImageFormat.PNG);
bool result = cameraView.SaveSnapShot(ImageFormat.PNG, filePath);
Record a video:
var result = await cameraView.StartRecordingAsync(Path.Combine(FileSystem.Current.CacheDirectory, "Video.mp4", new Size(1920, 1080)));
....
result = cameraView.StopRecordingAsync();
Take a photo
var stream = await cameraView.TakePhotoAsync();
if (stream != null)
{
var result = ImageSource.FromStream(() => stream);
snapPreview.Source = result;
}
Use Control with MVVM: The control has several binding properties for take an snapshot:
/// Binding property for use this control in MVVM.
public CameraView Self
/// Sets how often the SnapShot property is updated in seconds.
/// Default 0: no snapshots are taken
/// WARNING! A low frequency directly impacts over control performance and memory usage (with AutoSnapShotAsImageSource = true)
/// </summary>
public float AutoSnapShotSeconds
/// Sets the snaphost image format
public ImageFormat AutoSnapShotFormat
/// Refreshes according to the frequency set in the AutoSnapShotSeconds property (if AutoSnapShotAsImageSource is set to true) or when GetSnapShot is called or TakeAutoSnapShot is set to true
public ImageSource SnapShot
/// Refreshes according to the frequency set in the AutoSnapShotSeconds property or when GetSnapShot is called.
/// WARNING. Each time a snapshot is made, the previous stream is disposed.
public Stream SnapShotStream
/// Change from false to true refresh SnapShot property
public bool TakeAutoSnapShot
/// If true SnapShot property is refreshed according to the frequency set in the AutoSnapShotSeconds property
public bool AutoSnapShotAsImageSource
/// Starts/Stops the Preview if camera property has been set
public bool AutoStartPreview
{
get { return (bool)GetValue(AutoStartPreviewProperty); }
set { SetValue(AutoStartPreviewProperty, value); }
}
/// Full path to file where record video will be recorded.
public string AutoRecordingFile
{
get { return (string)GetValue(AutoRecordingFileProperty); }
set { SetValue(AutoRecordingFileProperty, value); }
}
/// Starts/Stops record video to AutoRecordingFile if camera and microphone properties have been set
public bool AutoStartRecording
{
get { return (bool)GetValue(AutoStartRecordingProperty); }
set { SetValue(AutoStartRecordingProperty, value); }
}
<sgmc:CameraView x:Name="cameraView" WidthRequest="200" HeightRequest="300"
BarCodeOptions="{Binding BarCodeOptions}"
BarCodeResults="{Binding BarCodeResults, Mode=OneWayToSource}"
Cameras="{Binding Cameras, Mode=OneWayToSource}" Camera="{Binding Camera}"
AutoStartPreview="{Binding AutoStartPreview}"
NumCamerasDetected="{Binding NumCameras, Mode=OneWayToSource}"
AutoSnapShotAsImageSource="True" AutoSnapShotFormat="PNG"
TakeAutoSnapShot="{Binding TakeSnapshot}" AutoSnapShotSeconds="{Binding SnapshotSeconds}"
Microphones="{Binding Microphones, Mode=OneWayToSource}" Microphone="{Binding Microphone}"
NumMicrophonesDetected="{Binding NumMicrophones, Mode=OneWayToSource}"
AutoRecordingFile="{Binding RecordingFile}"
AutoStartRecording="{Binding AutoStartRecording}"/>
You have a complete example of MVVM in our test project (https://github.com/SynergitCZ/Synergit.Maui.Camera/tree/master/Synergit.Maui.Camera.Test)
Enable and Handle barcodes detection:
cameraView.BarcodeDetected += CameraView_BarcodeDetected;
cameraView.BarCodeOptions = new ZXingHelper.BarcodeDecodeOptions
{
AutoRotate = true,
PossibleFormats = { ZXing.BarcodeFormat.QR_CODE },
ReadMultipleCodes = false,
TryHarder = true,
TryInverted = true
};
cameraView.BarCodeDetectionFrameRate = 10;
cameraView.BarCodeDetectionMaxThreads = 5;
cameraView.ControlBarcodeResultDuplicate = true;
cameraView.BarCodeDetectionEnabled = true;
private void CameraView_BarcodeDetected(object sender, ZXingHelper.BarcodeEventArgs args)
{
Debug.WriteLine("BarcodeText=" + args.Result[0].Text);
}
Use the event or the bindable property BarCodeResults
/// Event launched every time a code is detected in the image if "BarCodeDetectionEnabled" is set to true.
public event BarcodeResultHandler BarcodeDetected;
/// It refresh each time a barcode is detected if BarCodeDetectionEnabled porperty is true
public Result[] BarCodeResults
BarcodeImage
A ContentView control for generate codebars images.
In XAML, make sure to add the right XML namespace:
xmlns:sgmc="clr-namespace:Synergit.Maui.Camera;assembly=Synergit.Maui.Camera"
Use the control and its bindable properties:
<sgmc:BarcodeImage x:Name="barcodeImage" Aspect="AspectFit"
WidthRequest="400" HeightRequest="400"
BarcodeWidth="200" BarcodeHeight="200" BarcodeMargin="5"
BarcodeBackground="White" BarcodeForeground="Blue"
BarcodeFormat="QR_CODE" />
Set the barcode property to generate the image:
barcodeImage.Barcode = "https://github.com/SynergitCZ/Synergit.Maui.Camera";
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0-android34.0 is compatible. net8.0-ios17.0 is compatible. net8.0-maccatalyst17.0 is compatible. net8.0-windows10.0.19041 is compatible. |
-
net8.0-android34.0
- Microsoft.Extensions.Logging.Debug (>= 8.0.0)
- Microsoft.Maui.Controls (>= 8.0.3)
- Microsoft.Maui.Controls.Compatibility (>= 8.0.3)
- ZXing.Net (>= 0.16.9)
-
net8.0-ios17.0
- Microsoft.Extensions.Logging.Debug (>= 8.0.0)
- Microsoft.Maui.Controls (>= 8.0.3)
- Microsoft.Maui.Controls.Compatibility (>= 8.0.3)
- ZXing.Net (>= 0.16.9)
-
net8.0-maccatalyst17.0
- Microsoft.Extensions.Logging.Debug (>= 8.0.0)
- Microsoft.Maui.Controls (>= 8.0.3)
- Microsoft.Maui.Controls.Compatibility (>= 8.0.3)
- ZXing.Net (>= 0.16.9)
-
net8.0-windows10.0.19041
- Microsoft.Extensions.Logging.Debug (>= 8.0.0)
- Microsoft.Maui.Controls (>= 8.0.3)
- Microsoft.Maui.Controls.Compatibility (>= 8.0.3)
- ZXing.Net (>= 0.16.9)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
0.7.1-beta | 145 | 11/30/2023 |
0.7.0-beta | 50 | 11/29/2023 |