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 la aplicación 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;
}
}
Control del 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;
}
Implementación del comportamiento de reserva
Las aplicaciones deben implementar los pasos anteriores para alertar al usuario de detectar y alertar al usuario de que el acceso a la cámara está restringido debido a la configuración de privacidad y a dirigir al usuario a la página Configuración de privacidad de la cámara para permitirle actualizar su configuración. Después de estos pasos, la aplicación debe reintentar la inicialización de la cámara para ver si se ha concedido acceso. Si el usuario rechaza actualizar su configuración para permitir que la aplicación acceda a la cámara, considere la posibilidad de proporcionar 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.