Gestire l'impostazione della privacy della fotocamera di Windows

Windows consente agli utenti di concedere o negare l'accesso alla fotocamera del dispositivo nell'app Impostazioni di Windows, in Privacy e sicurezza -> Fotocamera. L'accesso alla fotocamera può essere disabilitato per l'intero dispositivo, per tutte le app non in pacchetto o per le singole app in pacchetto. Questo articolo descrive le procedure consigliate per verificare se l'app ha accesso alla fotocamera e gestisce il caso in cui l'accesso viene negato dall'utente.

Verificare l'accesso prima di inizializzare la fotocamera

Per le app in pacchetto, devi verificare se l'app ha accesso alla fotocamera prima di inizializzare la fotocamera. Usare la classe AppCapability per determinare se l'app ha accesso.

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

Gestire l'errore di accesso negato

Le API di acquisizione della fotocamera di Windows restituiranno l'errore E_ACCESSDENIED quando le app tentano di accedere al dispositivo di acquisizione della fotocamera se l'utente ha disabilitato la fotocamera nella pagina Impostazioni della privacy della fotocamera. Le app devono verificare la presenza di questo errore durante l'inizializzazione del dispositivo di acquisizione. Se l'inizializzazione non riesce con questo errore, è consigliabile indirizzare l'utente alla pagina Impostazioni privacy fotocamera e potenzialmente abilitare l'accesso per l'app. La pagina Impostazioni privacy fotocamera può essere avviata usando l'URI ms-settings:privacy-webcam.

Nell'esempio seguente viene illustrato come verificare la presenza di E_ACCESSDENIED quando si chiama 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"));
}

Nell'esempio seguente viene illustrata la gestione dell'errore di E_ACCESSDENIED restituito da IMFActivate::ActivateObject durante l'inizializzazione di un oggetto IMFMediaSource per un dispositivo di acquisizione.

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

Implementare il comportamento di fallback

Le app devono implementare i passaggi precedenti per avvisare l'utente di rilevare e avvisare l'utente che l'accesso alla fotocamera è limitato a causa delle impostazioni di privacy e di indirizzare l'utente alla pagina impostazioni della privacy della fotocamera per consentire loro di aggiornare le impostazioni. Dopo questi passaggi, l'app deve ripetere l'inizializzazione della fotocamera per verificare se l'accesso è stato concesso. Se l'utente rifiuta di aggiornare le impostazioni per consentire all'app di accedere alla fotocamera, valutare la possibilità di fornire funzionalità alternative. Ad esempio, è possibile disabilitare le funzionalità della fotocamera, passare a una modalità diversa o visualizzare un'immagine segnaposto al posto dell'anteprima della fotocamera.