Manipular a configuração de privacidade da câmera do Windows
O Windows permite que os usuários concedam ou neguem acesso à câmera do dispositivo no aplicativo Configurações do Windows, em Privacidade e Segurança -> Câmera. O acesso à câmera pode ser desabilitado para todo o dispositivo, para todos os aplicativos não empacotados ou para aplicativos empacotados individuais. Este artigo descreve as práticas recomendadas para verificar se seu aplicativo tem acesso à câmera e lidar com o caso em que o acesso é negado pelo usuário.
Verifique o acesso antes de inicializar a câmera
Para aplicativos empacotados, você deve verificar se seu aplicativo tem acesso à câmera antes de inicializar a câmera. Use a classe AppCapability para determinar se seu aplicativo tem acesso.
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;
}
}
Lidar com o erro de acesso negado
As APIs de captura de câmera do Windows retornarão o erro E_ACCESSDENIED quando os aplicativos tentarem acessar o dispositivo de captura de câmera se o usuário tiver desabilitado a câmera na página Configurações de privacidade da câmera. Os aplicativos devem verificar esse erro ao inicializar o dispositivo de captura. Se a inicialização falhar com esse erro, é recomendável direcionar o usuário para a página Configurações de privacidade da câmera e, possivelmente, habilitar o acesso para seu aplicativo. A página Configurações de privacidade da câmera pode ser iniciada usando o URI ms-settings:privacy-webcam
.
O exemplo a seguir ilustra como verificar E_ACCESSDENIED ao chamar 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"));
}
O exemplo a seguir ilustra como lidar com o erro de E_ACCESSDENIED retornado de IMFActivate::ActivateObject ao inicializar um IMFMediaSource para um 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 o comportamento de fallback
Os aplicativos devem implementar as etapas anteriores para alertar o usuário, detectar e alertar o usuário de que o acesso à câmera é restrito devido às configurações de privacidade e direcionar o usuário para a página Configurações de privacidade da câmera para permitir que ele atualize suas configurações. Após essas etapas, o aplicativo deve tentar novamente a inicialização da câmera para ver se o acesso foi concedido. Se o usuário se recusar a atualizar suas configurações para permitir que seu aplicativo acesse a câmera, considere fornecer uma funcionalidade alternativa. Por exemplo, você pode desativar os recursos da câmera, alternar para um modo diferente ou exibir uma imagem de espaço reservado no lugar da visualização da câmera.