Správa nastavení ochrany osobních údajů fotoaparátu Windows

Windows umožňuje uživatelům udělit nebo odepřít přístup ke kameře zařízení v nastavení Windows v části Ochrana osobních údajů a zabezpečení -> Kamera. Přístup k fotoaparátu je možné zakázat pro celé zařízení, pro všechny rozbalené aplikace nebo pro jednotlivé zabalené aplikace. Tento článek popisuje osvědčené postupy pro kontrolu, jestli má vaše aplikace přístup ke kameře, a řeší případ odepření přístupu uživatelem.

Kontrola přístupu před inicializací kamery

U zabalených aplikací byste měli před inicializací fotoaparátu zkontrolovat, jestli má vaše aplikace přístup k fotoaparátu. Pomocí třídy AppCapability určete, jestli má vaše aplikace přístup.

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

Zpracování chyby odepření přístupu

Rozhraní API pro zachytávání kamery ve Windows vrátí chybu E_ACCESSDENIED, když se aplikace pokusí získat přístup k zařízení kamery, pokud uživatel zakázal kameru na stránce Nastavení ochrany osobních údajů kamery. Aplikace by při inicializaci zařízení pro zachytávání měly zkontrolovat tuto chybu. Pokud inicializace selže s touto chybou, doporučujeme uživatele nasměrovat na stránku Nastavení ochrany osobních údajů fotoaparátu a potenciálně povolit přístup pro vaši aplikaci. Stránku Nastavení ochrany osobních údajů fotoaparátu lze spustit pomocí identifikátoru URI ms-settings:privacy-webcam.

Následující příklad ukazuje, jak zkontrolovat E_ACCESSDENIED při volání 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"));
}

Následující příklad ukazuje zpracování chyby E_ACCESSDENIED vrácené z IMFActivate::ActivateObject při inicializaci IMFMediaSource pro zachytávací zařízení.

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

Implementace náhradního chování

Aplikace by měly implementovat předchozí kroky, aby detekovaly a upozornily uživatele na to, že přístup k fotoaparátu je omezen z důvodu nastavení ochrany osobních údajů, a aby uživatele nasměrovaly na stránku nastavení ochrany osobních údajů fotoaparátu, kde mohou upravit svá nastavení. Po těchto krocích by aplikace měla zkusit inicializaci fotoaparátu zopakovat a zjistit, jestli byl udělen přístup. Pokud uživatel odmítne aktualizovat nastavení tak, aby mohla vaše aplikace přistupovat k fotoaparátu, zvažte poskytnutí alternativních funkcí. Můžete například zakázat funkce fotoaparátu, přepnout do jiného režimu nebo místo náhledu fotoaparátu zobrazit zástupný obrázek.