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

액세스 거부 오류 처리

Windows 카메라 캡처 API는 사용자가 카메라 개인 정보 설정 페이지에서 카메라를 사용하지 않도록 설정한 경우 앱이 카메라 캡처 디바이스에 액세스하려고 할 때 오류 E_ACCESSDENIED 반환합니다. 앱은 캡처 디바이스를 초기화할 때 이 오류를 확인해야 합니다. 이 오류로 초기화가 실패하는 경우 사용자를 카메라 개인 정보 설정 페이지로 안내하고 앱에 대한 액세스를 사용하도록 설정하는 것이 좋습니다. 카메라 개인 정보 설정 페이지는 URI ms-settings:privacy-webcam를 사용하여 시작할 수 있습니다.

다음 예제에서는 MediaCapture.InitializeAsync를 호출할 때 E_ACCESSDENIED 확인하는 방법을 보여 줍니다.

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

다음 예제에서는 캡처 디바이스에 대한 IMFMediaSource를 초기화할 때 IMFActivate::ActivateObject에서 반환된 E_ACCESSDENIED 오류를 처리하는 방법을 보여 줍니다.

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

대체 동작 구현

앱은 사용자에게 개인 정보 설정으로 인해 카메라 액세스가 제한됨을 감지하고 경고하고 사용자가 설정을 업데이트할 수 있도록 카메라 개인 정보 설정 페이지로 사용자를 안내하도록 경고하는 이전 단계를 구현해야 합니다. 이러한 단계 후에 앱은 카메라 초기화를 다시 시도하여 액세스 권한이 부여되었는지 확인해야 합니다. 사용자가 앱이 카메라에 액세스할 수 있도록 설정을 업데이트하지 않는 경우 대체 기능을 제공하는 것이 좋습니다. 예를 들어 카메라 기능을 사용하지 않도록 설정하거나, 다른 모드로 전환하거나, 카메라 미리 보기 대신 자리 표시자 이미지를 표시할 수 있습니다.