Controlar la configuración de privacidad de la cámara de Windows

Windows permite a los usuarios conceder o denegar el acceso a la cámara del dispositivo en Configuración de Windows, en Privacidad y seguridad -> Cámara. El acceso a la cámara se puede deshabilitar para todo el dispositivo, para todas las aplicaciones sin empaquetar o para aplicaciones empaquetadas individuales. En este artículo se describen los procedimientos recomendados para comprobar si la aplicación tiene acceso a la cámara y controlar el caso en el que el usuario deniega el acceso.

Comprobación del acceso antes de inicializar la cámara

Para las aplicaciones empaquetadas, debes comprobar si la aplicación tiene acceso a la cámara antes de inicializar la cámara. Usa la clase AppCapability para determinar si la aplicación tiene acceso.

bool cameraCapabilityAccess = false;
private void CheckCameraAccessStatus()
{
    var status = AppCapability.Create("Webcam").CheckAccess();
    
    if (status == AppCapabilityAccessStatus.Allowed)
    {
        cameraCapabilityAccess = true;
        cameraButton.IsEnabled = true;
    }
    else
    {
        cameraCapabilityAccess = false;
        cameraButton.IsEnabled = false;
    }
}

Gestionar el error de acceso denegado

Las API de captura de cámara de Windows devolverán el error E_ACCESSDENIED cuando las aplicaciones intenten acceder al dispositivo de captura de cámara si el usuario ha deshabilitado la cámara en la página Configuración de privacidad de la cámara. Las aplicaciones deben comprobar este error al inicializar el dispositivo de captura. Si se produce un error en la inicialización, se recomienda dirigir al usuario a la página Configuración de privacidad de la cámara y habilitar potencialmente el acceso a la aplicación. La página Configuración de privacidad de la cámara se puede iniciar mediante el URI ms-settings:privacy-webcam.

En el ejemplo siguiente se muestra cómo comprobar E_ACCESSDENIED al llamar a MediaCapture.InitializeAsync.

try
{
    await mediaCapture.InitializeAsync(mediaCaptureInitializationSettings);
}
catch (System.UnauthorizedAccessException ex)
{
    // E_ACCESSDENIED, 0x80070005 in hexadecimal, -2147024891 in decimal
    if (ex.HResult == -2147024891)
    {
        StatusTextBlock.Text = "Access to the camera has been denied." +
            "Click the Settings button to check the camera privacy settings";               
    }

    return;
}
...
// Launch the camera privacy Settings page
private async void LaunchSettingsButton_Click(object sender, RoutedEventArgs e)
{
    bool result = await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-webcam"));
}

En el ejemplo siguiente se muestra cómo controlar el error de E_ACCESSDENIED devuelto de IMFActivate::ActivateObject al inicializar un IMFMediaSource para un dispositivo de captura.

IMFMediaSource* pSource = NULL;
IMFAttributes* pAttributes = NULL;
IMFActivate** ppDevices = NULL;

// Create an attribute store to specify the enumeration parameters.
HRESULT hr = MFCreateAttributes(&pAttributes, 1);
if (FAILED(hr))
{
    goto done;
}

// Source type: video capture devices
hr = pAttributes->SetGUID(
    MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
    MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
);
if (FAILED(hr))
{
    goto done;
}

// Enumerate devices.
UINT32 count;
hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count);
if (FAILED(hr))
{
    goto done;
}

if (count == 0)
{
    hr = E_FAIL;
    goto done;
}

// Create the media source object.
hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource));
if (FAILED(hr))
{
    if (hr == E_ACCESSDENIED)
    {
        int response = MessageBox(hWnd, L"Access to the camera was denied. Open the camera privacy settings?", L"Error", MB_YESNO);
        if (response == IDYES)
        {
            ShellExecute(NULL, L"open", L"ms-settings:privacy-webcam", L"", L".", SW_SHOWDEFAULT);
        }
    } 
    goto done;
}

Implementar el comportamiento alternativo

Las aplicaciones deben usar los pasos anteriores para detectar el acceso restringido a la cámara, avisar al usuario y dirigirlos a la página de configuración de privacidad de la cámara. Una vez que el usuario vuelve de Configuración, la aplicación puede reintentar la inicialización de la cámara para determinar si se ha concedido acceso. Si el acceso a la cámara sigue sin estar disponible, proporcione funcionalidad alternativa. Por ejemplo, podría deshabilitar las características de la cámara, cambiar a un modo diferente o mostrar una imagen de marcador de posición en lugar de la vista previa de la cámara.