Compartilhar via


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 & Segurança -> Câmera. O acesso à câmera pode ser desativado 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, verifique se o aplicativo tem acesso à câmera antes de inicializá-la. 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;
    }
}

Manipular o erro de acesso negado

As APIs de captura de câmera do Windows retornarão a E_ACCESSDENIED de erro 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, potencialmente, habilitar o acesso ao 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 se há 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 a manipulação do erro 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 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 está 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 funcionalidades alternativas. 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.