Lotzi11
Lotzi11

Reputation: 549

UWP MediaCapture Denied Access to Camera

I am trying to make a project that allows me to pull up a camera, but I am told that I was denied access to the camera every time the program ran. I read through the tutorial from the following link https://msdn.microsoft.com/en-us/library/windows/apps/mt243896.aspx and made some minor changes to the code, but the changes shouldn't affect the outcome

    private MediaCapture _mediaCapture;
    private bool _isInitialized;

  private async Task InitializeCameraAsync()
    {
        if (_mediaCapture == null)
        {
            // Get available devices for capturing pictures
            var allVideoDevices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);

            // Get the desired camera by panel
            DeviceInformation cameraDevice =
                allVideoDevices.FirstOrDefault(x => x.EnclosureLocation != null &&
                x.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back);

            // If there is no camera on the specified panel, get any camera
            cameraDevice = cameraDevice ?? allVideoDevices.FirstOrDefault();

            if (cameraDevice == null)
            {
                Debug.WriteLine("No camera device found.");
                return;
            }

            // Create MediaCapture and its settings
            _mediaCapture = new MediaCapture();

            MediaCaptureInitializationSettings mediaInitSettings = new MediaCaptureInitializationSettings {
                VideoDeviceId = cameraDevice.Id
              };

            // Initialize MediaCapture
            try
            {
                await _mediaCapture.InitializeAsync(mediaInitSettings);
                _isInitialized = true;
            }
            catch (UnauthorizedAccessException)
            {
                Debug.WriteLine("The app was denied access to the camera");
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception when initializing MediaCapture with {0}: {1}", cameraDevice.Id, ex.ToString());
            }

            // If initialization succeeded, start the preview
            if (_isInitialized)
            {
                // Figure out where the camera is located
                if (cameraDevice.EnclosureLocation == null || cameraDevice.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Unknown)
                {
                    // No information on the location of the camera, assume it's an external camera, not integrated on the device
                    _externalCamera = true;
                }
                else
                {
                    // Camera is fixed on the device
                    _externalCamera = false;

                    // Only mirror the preview if the camera is on the front panel
                    _mirroringPreview = (cameraDevice.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front);
                }

                await StartPreviewAsync();

            }
        }
    }

Also, I made sure that my camera allows access to be used for apps. Does anyone have an idea of why it's not working?

Upvotes: 6

Views: 5692

Answers (3)

Martin.Martinsson
Martin.Martinsson

Reputation: 2154

You can enable microphone or video access globally for all apps in registry:

1. reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\AppPrivacy / v LetAppsAccessMicrophone / t REG_DWORD / d 0x1 / f
2. reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\AppPrivacy / v LetAppsAccessCamera / t REG_DWORD / d 0x1 / f

You need admin rights to do it, so add a manifest file to your app to request that right!

    enum AppControlType
    {
        /// <summary>
        /// User must set access
        /// </summary>
        UserHasControl,
        /// <summary>
        /// Approval for all apps
        /// </summary>
        ForceApproval,
        /// <summary>
        /// Denial for all apps
        /// </summary>
        ForceDenial
    }

    static void SetMicrophoneAccessForApps(AppControlType type)
    {
        using var reg = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Policies\\Microsoft\\Windows\\AppPrivacy", true);
        reg?.SetValue("LetAppsAccessMicrophone", type, RegistryValueKind.DWord);
    }

    static void SetCameraAccessForApps(AppControlType type)
    {
        using var reg = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Policies\\Microsoft\\Windows\\AppPrivacy", true);
        reg?.SetValue("LetAppsAccessCamera", type, RegistryValueKind.DWord);
    }

Be aware: you enable microphone or video access for all apps!

Regards

Upvotes: 0

jameshfisher
jameshfisher

Reputation: 36579

Use StreamingCaptureMode = StreamingCaptureMode.Video to only request access to the camera, like this:

await _mediaCapture.InitializeAsync(new MediaCaptureInitializationSettings
{
    StreamingCaptureMode = StreamingCaptureMode.Video 
});

Upvotes: 0

Apoorv
Apoorv

Reputation: 2043

Add Microphone and camera properties from Manifest file. The Manifest file shall be present in the project only. Search for Capabilities tab and check the relevant options

Upvotes: 21

Related Questions