From 43015bef59063ecd31425a898cba0ba9d6277e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Ortego=20P=C3=A9rez?= Date: Tue, 10 Mar 2026 09:49:03 +0100 Subject: [PATCH 01/11] fix: allow camera usage when microphone permission is denied on Windows --- .../CameraViewExtensions.windows.cs | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs b/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs index 8d525b70df..f6d9737953 100644 --- a/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs +++ b/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs @@ -1,5 +1,6 @@ using CommunityToolkit.Maui.Core; using Windows.Devices.Enumeration; +using Windows.Media; using Windows.Media.Capture; namespace CommunityToolkit.Maui.Extensions; @@ -13,20 +14,44 @@ public static async Task UpdateAvailability(this ICameraView cameraView, Cancell cameraView.IsAvailable = videoCaptureDevices.Count > 0; } - public static Task InitializeCameraForCameraView(this MediaCapture mediaCapture, string deviceId, CancellationToken token) + public static async Task InitializeCameraForCameraView(this MediaCapture mediaCapture, string deviceId, CancellationToken token) { try { - return mediaCapture.InitializeAsync(new MediaCaptureInitializationSettings + var settings = new MediaCaptureInitializationSettings { VideoDeviceId = deviceId, PhotoCaptureSource = PhotoCaptureSource.Auto - }).AsTask(token); + }; + + PermissionStatus microphonePermissionStatus = PermissionStatus.Unknown; + var isMicrophoneCapable = Permissions.IsCapabilityDeclared("microphone"); + + if (isMicrophoneCapable) + { + microphonePermissionStatus = await Permissions.CheckStatusAsync(); + } + + if (!isMicrophoneCapable || microphonePermissionStatus != PermissionStatus.Granted) + { + settings.StreamingCaptureMode = StreamingCaptureMode.Video; + settings.MediaCategory = MediaCategory.Media; + settings.AudioProcessing = AudioProcessing.Default; + } + + var cameraPermissionStatus = await Permissions.CheckStatusAsync(); + if (cameraPermissionStatus == PermissionStatus.Granted) + { + await mediaCapture.InitializeAsync(settings).AsTask(token); + } + else + { + throw new CameraException("Camera permission is not granted."); + } } catch (System.Runtime.InteropServices.COMException) { // Camera already initialized - return Task.CompletedTask; } } } \ No newline at end of file From b40f1a686e944a0a3adf63424fba357f2ae67512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Ortego=20P=C3=A9rez?= Date: Thu, 30 Apr 2026 13:54:44 +0200 Subject: [PATCH 02/11] revert: do not check the camera permission when initilizing the camera --- .../Extensions/CameraViewExtensions.windows.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs b/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs index f6d9737953..bb2fe7a4f2 100644 --- a/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs +++ b/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs @@ -39,15 +39,7 @@ public static async Task InitializeCameraForCameraView(this MediaCapture mediaCa settings.AudioProcessing = AudioProcessing.Default; } - var cameraPermissionStatus = await Permissions.CheckStatusAsync(); - if (cameraPermissionStatus == PermissionStatus.Granted) - { - await mediaCapture.InitializeAsync(settings).AsTask(token); - } - else - { - throw new CameraException("Camera permission is not granted."); - } + await mediaCapture.InitializeAsync(settings).AsTask(token); } catch (System.Runtime.InteropServices.COMException) { From 753bfbc6ef6eec5933a5d5005859b49cba12b7f7 Mon Sep 17 00:00:00 2001 From: Vladislav Antonyuk Date: Sun, 10 May 2026 17:30:12 +0300 Subject: [PATCH 03/11] Use msix, otherwise app.manifest is not found --- .../CommunityToolkit.Maui.Sample.csproj | 2 +- .../CommunityToolkit.Maui.Sample/Properties/launchSettings.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/CommunityToolkit.Maui.Sample/CommunityToolkit.Maui.Sample.csproj b/samples/CommunityToolkit.Maui.Sample/CommunityToolkit.Maui.Sample.csproj index 5000171233..afd7163a62 100644 --- a/samples/CommunityToolkit.Maui.Sample/CommunityToolkit.Maui.Sample.csproj +++ b/samples/CommunityToolkit.Maui.Sample/CommunityToolkit.Maui.Sample.csproj @@ -24,7 +24,7 @@ 1 - None + MSIX true IL2026 diff --git a/samples/CommunityToolkit.Maui.Sample/Properties/launchSettings.json b/samples/CommunityToolkit.Maui.Sample/Properties/launchSettings.json index 4f857936f4..edf8aadcc8 100644 --- a/samples/CommunityToolkit.Maui.Sample/Properties/launchSettings.json +++ b/samples/CommunityToolkit.Maui.Sample/Properties/launchSettings.json @@ -1,7 +1,7 @@ { "profiles": { "Windows Machine": { - "commandName": "Project", + "commandName": "MsixPackage", "nativeDebugging": false } } From 26534553c8dfe77213c0a0cff10066c30fa28bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Ortego=20P=C3=A9rez?= Date: Tue, 12 May 2026 14:35:30 +0200 Subject: [PATCH 04/11] fix: ignore microphone capability for unpackaged apps --- .../Extensions/CameraViewExtensions.windows.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs b/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs index bb2fe7a4f2..a888cf7b32 100644 --- a/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs +++ b/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs @@ -25,7 +25,11 @@ public static async Task InitializeCameraForCameraView(this MediaCapture mediaCa }; PermissionStatus microphonePermissionStatus = PermissionStatus.Unknown; - var isMicrophoneCapable = Permissions.IsCapabilityDeclared("microphone"); + + // unpackaged apps always have the capability + var isMicrophoneCapable = + AppInfo.PackagingModel != AppPackagingModel.Packaged || + Permissions.IsCapabilityDeclared("microphone"); if (isMicrophoneCapable) { From a214d44cc264228593a39588efdf91b6dded4600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Ortego=20P=C3=A9rez?= Date: Tue, 12 May 2026 14:39:36 +0200 Subject: [PATCH 05/11] fix: in the camera view, the alert displayed when no microphone permissions are granted has been improved. --- .../Pages/Views/CameraView/CameraViewPage.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs index a4069818ce..1da832cf81 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs @@ -37,7 +37,7 @@ protected override async void OnAppearing() var microphonePermissionsRequest = await Permissions.RequestAsync(); if (microphonePermissionsRequest is not PermissionStatus.Granted) { - await Shell.Current.CurrentPage.DisplayAlertAsync("Microphone permission is not granted.", "Please grant the permission to use this feature.", "OK"); +  await Shell.Current.CurrentPage.DisplayAlertAsync("Microphone permission is not granted.", "Video capturing will not be available without the Microphone permission.", "OK"); return; } } From 5c2b246190d23c52e4380f39912459060bac1e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Ortego=20P=C3=A9rez?= Date: Tue, 12 May 2026 14:42:12 +0200 Subject: [PATCH 06/11] fix: Enable webcam capability for Windows camera access --- .../Platforms/Windows/Package.appxmanifest | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/CommunityToolkit.Maui.Sample/Platforms/Windows/Package.appxmanifest b/samples/CommunityToolkit.Maui.Sample/Platforms/Windows/Package.appxmanifest index 2225753a55..48b2bd9b8b 100644 --- a/samples/CommunityToolkit.Maui.Sample/Platforms/Windows/Package.appxmanifest +++ b/samples/CommunityToolkit.Maui.Sample/Platforms/Windows/Package.appxmanifest @@ -58,6 +58,7 @@ + \ No newline at end of file From 0ae9b388269cdf83181bc24d0134012b87c46a7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Ortego=20P=C3=A9rez?= Date: Fri, 15 May 2026 09:16:12 +0200 Subject: [PATCH 07/11] Fix: do not close the camera page if microphone permissions are not granted --- .../Pages/Views/CameraView/CameraViewPage.xaml.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs index 1da832cf81..2d4a64d7e5 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs @@ -37,8 +37,7 @@ protected override async void OnAppearing() var microphonePermissionsRequest = await Permissions.RequestAsync(); if (microphonePermissionsRequest is not PermissionStatus.Granted) { -  await Shell.Current.CurrentPage.DisplayAlertAsync("Microphone permission is not granted.", "Video capturing will not be available without the Microphone permission.", "OK"); - return; +  await Shell.Current.CurrentPage.DisplayAlertAsync("Microphone permission is not granted.", "Video capturing will not be available without the Microphone permission.", "OK"); } } catch (FileNotFoundException) when (OperatingSystem.IsWindows()) // Unpackaged Windows Apps do not generate the required file AppxManifest.xml From dea2377dc1d7f837cf8f175b2fb8202f613cb37c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Ortego=20P=C3=A9rez?= Date: Mon, 18 May 2026 09:14:25 +0200 Subject: [PATCH 08/11] fix: remove non-standard whitespace before await --- .../Pages/Views/CameraView/CameraViewPage.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs index 2d4a64d7e5..cd2435216e 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs @@ -37,7 +37,7 @@ protected override async void OnAppearing() var microphonePermissionsRequest = await Permissions.RequestAsync(); if (microphonePermissionsRequest is not PermissionStatus.Granted) { -  await Shell.Current.CurrentPage.DisplayAlertAsync("Microphone permission is not granted.", "Video capturing will not be available without the Microphone permission.", "OK"); + await Shell.Current.CurrentPage.DisplayAlertAsync("Microphone permission is not granted.", "Video capturing will not be available without the Microphone permission.", "OK"); } } catch (FileNotFoundException) when (OperatingSystem.IsWindows()) // Unpackaged Windows Apps do not generate the required file AppxManifest.xml From c28c193588fe47f7ecab36c2e3efd952468090c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Ortego=20P=C3=A9rez?= Date: Mon, 18 May 2026 09:24:15 +0200 Subject: [PATCH 09/11] Revert "Use msix, otherwise app.manifest is not found" This reverts commit 1b5990d3cb0224aebe0f6a521d450e050e1dc763. --- .../CommunityToolkit.Maui.Sample.csproj | 2 +- .../CommunityToolkit.Maui.Sample/Properties/launchSettings.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/CommunityToolkit.Maui.Sample/CommunityToolkit.Maui.Sample.csproj b/samples/CommunityToolkit.Maui.Sample/CommunityToolkit.Maui.Sample.csproj index afd7163a62..5000171233 100644 --- a/samples/CommunityToolkit.Maui.Sample/CommunityToolkit.Maui.Sample.csproj +++ b/samples/CommunityToolkit.Maui.Sample/CommunityToolkit.Maui.Sample.csproj @@ -24,7 +24,7 @@ 1 - MSIX + None true IL2026 diff --git a/samples/CommunityToolkit.Maui.Sample/Properties/launchSettings.json b/samples/CommunityToolkit.Maui.Sample/Properties/launchSettings.json index edf8aadcc8..4f857936f4 100644 --- a/samples/CommunityToolkit.Maui.Sample/Properties/launchSettings.json +++ b/samples/CommunityToolkit.Maui.Sample/Properties/launchSettings.json @@ -1,7 +1,7 @@ { "profiles": { "Windows Machine": { - "commandName": "MsixPackage", + "commandName": "Project", "nativeDebugging": false } } From 876b80ad8bba17a94ce410cf9c2ac73c0b7a4b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Ortego=20P=C3=A9rez?= Date: Mon, 18 May 2026 09:54:45 +0200 Subject: [PATCH 10/11] fix: improve warning message for video recording without microphone permission --- .../Pages/Views/CameraView/CameraViewPage.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs index cd2435216e..e8ef1aeddd 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/CameraView/CameraViewPage.xaml.cs @@ -37,7 +37,7 @@ protected override async void OnAppearing() var microphonePermissionsRequest = await Permissions.RequestAsync(); if (microphonePermissionsRequest is not PermissionStatus.Granted) { - await Shell.Current.CurrentPage.DisplayAlertAsync("Microphone permission is not granted.", "Video capturing will not be available without the Microphone permission.", "OK"); + await Shell.Current.CurrentPage.DisplayAlertAsync("Microphone permission is not granted.", "Audio recording will not be available without the Microphone permission, and captured video will be silent.", "OK"); } } catch (FileNotFoundException) when (OperatingSystem.IsWindows()) // Unpackaged Windows Apps do not generate the required file AppxManifest.xml From e3f2637c6ccd9c8ca2437eb1295511c0005e1640 Mon Sep 17 00:00:00 2001 From: AopBK <125977679+AopBK@users.noreply.github.com> Date: Tue, 26 May 2026 18:50:52 +0200 Subject: [PATCH 11/11] docs: clarify Windows packaged app permission check comment Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../Extensions/CameraViewExtensions.windows.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs b/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs index a888cf7b32..7f9b81f955 100644 --- a/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs +++ b/src/CommunityToolkit.Maui.Camera/Extensions/CameraViewExtensions.windows.cs @@ -26,9 +26,9 @@ public static async Task InitializeCameraForCameraView(this MediaCapture mediaCa PermissionStatus microphonePermissionStatus = PermissionStatus.Unknown; - // unpackaged apps always have the capability + // Permission checks require a packaged app manifest on Windows var isMicrophoneCapable = - AppInfo.PackagingModel != AppPackagingModel.Packaged || + AppInfo.PackagingModel == AppPackagingModel.Packaged && Permissions.IsCapabilityDeclared("microphone"); if (isMicrophoneCapable)