Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
313a3b6
Camera Video Recording
VladislavAntonyuk Jun 12, 2025
9aded49
Android Write to file
VladislavAntonyuk Jun 14, 2025
50055e3
Fix recording
VladislavAntonyuk Jun 15, 2025
bcdfcaf
Fix windows recording
VladislavAntonyuk Jun 15, 2025
ae96f4d
check for null
VladislavAntonyuk Jun 15, 2025
a866b74
Fix to work with old devices
VladislavAntonyuk Jun 15, 2025
c72a293
Add camera extensions to android
VladislavAntonyuk Jun 21, 2025
4fbfac9
Fix crash
VladislavAntonyuk Jun 21, 2025
803e21f
updatr csproj
VladislavAntonyuk Jun 23, 2025
8f4f1c6
Merge branch 'main' into feature/camera-video-recording
VladislavAntonyuk Jun 26, 2025
02ef483
Merge branch 'main' into feature/camera-video-recording
ne0rrmatrix Jul 3, 2025
5ae086d
Merge branch 'main' into feature/camera-video-recording
VladislavAntonyuk Jul 6, 2025
e5fb573
Fix merge conflicts
VladislavAntonyuk Jul 6, 2025
be1ef9e
implement ios
VladislavAntonyuk Jul 6, 2025
f23cd6b
fix build
VladislavAntonyuk Jul 6, 2025
8f74aa9
Fix sample app
VladislavAntonyuk Jul 7, 2025
0b336c1
Fix video recording finalization
VladislavAntonyuk Jul 7, 2025
d42d978
Move stream as input parameter to avoid memory streams
VladislavAntonyuk Jul 7, 2025
e8b8a26
Fixes video recording stream handling
VladislavAntonyuk Jul 8, 2025
fb1d056
Updates PlatformStartVideoRecording signature
VladislavAntonyuk Jul 8, 2025
d76920d
Fix Android extension modes
VladislavAntonyuk Jul 16, 2025
0f0c926
Rework Android binding and add iOS implementation
VladislavAntonyuk Jul 19, 2025
331b990
Add video recording controls and improve async handling
VladislavAntonyuk Jul 19, 2025
81ef874
Merge branch 'main' into feature/camera-video-recording
VladislavAntonyuk Jul 19, 2025
6f91cd7
Add summary
VladislavAntonyuk Jul 19, 2025
697da18
Merge branch 'feature/camera-video-recording' of https://github.com/C…
VladislavAntonyuk Jul 19, 2025
528c70d
add tests
VladislavAntonyuk Jul 19, 2025
802ca75
Merge branch 'main' into feature/camera-video-recording
ne0rrmatrix Jul 26, 2025
cdd819a
remove !
VladislavAntonyuk Jul 27, 2025
e6234a5
Merge branch 'main' into feature/camera-video-recording
ne0rrmatrix Sep 6, 2025
690dd3b
Remove unused fields
TheCodeTraveler Sep 7, 2025
cba0b9e
Implement Disposables
TheCodeTraveler Sep 7, 2025
352a7e9
Move `Stream` to CameraViewPage
TheCodeTraveler Sep 7, 2025
4354246
Move disposal of videoRecordingStream to `Dispose()`
TheCodeTraveler Sep 7, 2025
6be4152
Refactor `StartVideoRecording` to return `Task<Stream>`
TheCodeTraveler Sep 7, 2025
be07891
Revert "Refactor `StartVideoRecording` to return `Task<Stream>`"
VladislavAntonyuk Sep 12, 2025
1fab40f
Fix Apple video recording
VladislavAntonyuk Sep 12, 2025
17f202f
Requests microphone permission for video recording
VladislavAntonyuk Sep 12, 2025
f7030de
Merge branch 'main' into feature/camera-video-recording
VladislavAntonyuk Sep 12, 2025
e4d3dc1
Merge branch 'main' into feature/camera-video-recording
TheCodeTraveler Oct 14, 2025
cd5a30d
Add `ICameraView.StartVideoRecording(CancellationToken)`
TheCodeTraveler Oct 14, 2025
ceb400a
Update CameraManager.windows.cs
TheCodeTraveler Oct 14, 2025
a399058
Remove `SupportedOSPlatform`
TheCodeTraveler Oct 14, 2025
718da2a
`dotnet format`
TheCodeTraveler Oct 14, 2025
9ae9ef9
Remove unnecessary code
TheCodeTraveler Oct 15, 2025
55150a7
Update CameraViewHandler.shared.cs
TheCodeTraveler Oct 15, 2025
2b2f782
Implement `CancellationToken`
TheCodeTraveler Oct 15, 2025
4985341
Update CameraManager.macios.cs
TheCodeTraveler Oct 15, 2025
d097fed
Add `CancellationToken`
TheCodeTraveler Oct 15, 2025
86e520b
Merge branch 'main' into feature/camera-video-recording
TheCodeTraveler Oct 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
<Button Clicked="ZoomIn" Text="Zoom +" Grid.Column="2"/>
</Grid>

<Grid Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="3" BackgroundColor="#80CCCCCC">
<Grid Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="5" BackgroundColor="#80CCCCCC">

<FlexLayout Margin="5" JustifyContent="SpaceBetween" Wrap="Wrap">

Expand All @@ -73,15 +73,28 @@
ItemsSource="{Binding FlashModes}"
SelectedItem="{Binding FlashMode}" />

<Button Command="{Binding CaptureImageCommand, Source={x:Reference Camera}, x:DataType=toolkit:CameraView}"
CommandParameter="{Binding Token}"
Text="Capture Image"/>
<Button Command="{Binding StartCameraPreviewCommand, Source={x:Reference Camera}, x:DataType=toolkit:CameraView}"
CommandParameter="{Binding Token}"
Text="StartCameraPreview" />
Text="Start Camera Preview" />

<Button Command="{Binding StopCameraPreviewCommand, Source={x:Reference Camera}, x:DataType=toolkit:CameraView}"
Text="StopCameraPreview" />
Text="Stop Camera Preview" />


<Button Clicked="StartCameraRecording"
Text="Start Video Recording" />

<Button Clicked="StopCameraRecording"
CommandParameter="{Binding Token}"
Text="Stop Video Recording" />

<Button Clicked="SaveVideo" Text="Save Video Recording" />

<Button Command="{Binding CaptureImageCommand, Source={x:Reference Camera}, x:DataType=toolkit:CameraView}"
CommandParameter="{Binding Token}"
Text="Capture Image"/>

<Button Clicked="SetNightMode" Text="Set Night Mode (Android)" />

</FlexLayout>
</Grid>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
using System.Diagnostics;
using CommunityToolkit.Maui.Core;
using CommunityToolkit.Maui.Sample.ViewModels.Views;
using CommunityToolkit.Maui.Storage;

namespace CommunityToolkit.Maui.Sample.Pages.Views;

public partial class CameraViewPage : BasePage<CameraViewViewModel>
public sealed partial class CameraViewPage : BasePage<CameraViewViewModel>
{
readonly IFileSaver fileSaver;
readonly string imagePath;

int pageCount;
Stream videoRecordingStream = Stream.Null;

public CameraViewPage(CameraViewViewModel viewModel, IFileSystem fileSystem) : base(viewModel)
public CameraViewPage(CameraViewViewModel viewModel, IFileSystem fileSystem, IFileSaver fileSaver) : base(viewModel)
{
InitializeComponent();

this.fileSaver = fileSaver;
imagePath = Path.Combine(fileSystem.CacheDirectory, "camera-view-image.jpg");

Camera.MediaCaptured += OnMediaCaptured;

Loaded += (s, e) =>
{
pageCount = Navigation.NavigationStack.Count;
};
Loaded += (s, e) => { pageCount = Navigation.NavigationStack.Count; };
}

protected override async void OnAppearing()
Expand Down Expand Up @@ -51,6 +53,7 @@ async void OnImageTapped(object? sender, TappedEventArgs args)
{
return;
}

await Navigation.PushAsync(new ImageViewPage(imagePath));
}

Expand Down Expand Up @@ -82,7 +85,6 @@ void OnMediaCaptured(object? sender, MediaCapturedEventArgs e)

debugText.Text = $"Image saved to {imagePath}";
});

}

void ZoomIn(object? sender, EventArgs e)
Expand All @@ -94,4 +96,37 @@ void ZoomOut(object? sender, EventArgs e)
{
Camera.ZoomFactor -= 1.0f;
}

async void SetNightMode(object? sender, EventArgs e)
{
#if ANDROID
await Camera.SetExtensionMode(AndroidX.Camera.Extensions.ExtensionMode.Night);
#else
await Task.CompletedTask;
#endif
}

async void StartCameraRecording(object? sender, EventArgs e)
{
await Camera.StartVideoRecording(CancellationToken.None);
}

async void StopCameraRecording(object? sender, EventArgs e)
{
videoRecordingStream = await Camera.StopVideoRecording(CancellationToken.None);
}

async void SaveVideo(object? sender, EventArgs e)
{
if (videoRecordingStream == Stream.Null)
{
await DisplayAlert("Unable to Save Video", "Stream is null", "OK");
}
else
{
await fileSaver.SaveAsync("recording.mp4", videoRecordingStream);
await videoRecordingStream.DisposeAsync();
videoRecordingStream = Stream.Null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ void UpdateResolutionText()
{
ResolutionText = $"Selected Resolution: {SelectedResolution.Width} x {SelectedResolution.Height}";
}

void HandleAvailableCamerasChanged(object? sender, IReadOnlyList<CameraInfo>? e)
{
OnPropertyChanged(nameof(Cameras));
Expand Down
Loading
Loading