Поделиться через


Обработка параметра конфиденциальности камеры Windows

Windows позволяет пользователям предоставлять или запрещать доступ к камере устройства в приложении "Параметры Windows" в разделе "Конфиденциальность и безопасность —> камера". Доступ к камере можно отключить для всего устройства, для всех распакованных приложений или отдельных упакованных приложений. В этой статье описаны рекомендации по проверке того, имеет ли приложение доступ к камере и обрабатывает ситуацию, когда доступ запрещен пользователем.

Проверка доступа перед инициализацией камеры

Для упакованных приложений необходимо проверить, имеет ли приложение доступ к камере перед инициализацией камеры. Используйте класс AppCapability, чтобы определить, имеет ли приложение доступ.

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;
    }
}

Обработка ошибки отказа в доступе

API захвата камеры Windows возвращают ошибку E_ACCESSDENIED при попытке приложений получить доступ к устройству захвата камеры, если пользователь отключил камеру на странице параметров конфиденциальности камеры. Приложения должны проверять эту ошибку при инициализации устройства записи. Если инициализация завершается ошибкой, рекомендуется направить пользователя на страницу параметров конфиденциальности камеры и включить доступ к приложению. Страница параметров конфиденциальности камеры может быть запущена с помощью URI ms-settings:privacy-webcam.

В следующем примере показано, как проверить наличие E_ACCESSDENIED при вызове 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"));
}

В следующем примере показана обработка ошибки E_ACCESSDENIED, возвращаемой из МВФActivate::ActivateObject при инициализации МВФMediaSource для устройства захвата.

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;
}

Реализация резервного поведения

Приложения должны реализовать предыдущие шаги, чтобы предупредить пользователя об обнаружении и предупреждении пользователя о том, что доступ к камере ограничен из-за параметров конфиденциальности, и направить пользователя на страницу параметров конфиденциальности камеры, чтобы разрешить им обновлять свои параметры. После выполнения этих действий приложение должно повторить инициализацию камеры, чтобы узнать, предоставлен ли доступ. Если пользователь отказывается обновить свои параметры, чтобы разрешить приложению доступ к камере, рассмотрите возможность предоставления альтернативных функций. Например, можно отключить функции камеры, переключиться в другой режим или отобразить заполнитель вместо предварительного просмотра камеры.