Gérer le paramètre de confidentialité de la caméra Windows

Windows permet aux utilisateurs d’accorder ou de refuser l’accès à la caméra de l’appareil dans l’application Paramètres Windows, sous Confidentialité et Sécurité -> Caméra. L’accès à la caméra peut être désactivé pour l’ensemble de l’appareil, pour toutes les applications non empaquetées ou pour les applications empaquetées individuelles. Cet article décrit les meilleures pratiques pour vérifier si votre application a accès à la caméra et gérer le cas où l’accès est refusé par l’utilisateur.

Rechercher l’accès avant d’initialiser la caméra

Pour les applications empaquetées, vous devez vérifier si votre application dispose d’un accès à la caméra avant d’initialiser la caméra. Utilisez la classe AppCapability pour déterminer si votre application a accès.

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

Gérer l’erreur d’accès refusé

Les API de capture d’appareil photo Windows retournent l’erreur E_ACCESSDENIED lorsque les applications tentent d’accéder à l’appareil photo si l’utilisateur a désactivé la caméra dans la page Paramètres de confidentialité de l’appareil photo. Les applications doivent vérifier cette erreur lors de l’initialisation de l’appareil de capture. Si l’initialisation échoue avec cette erreur, il est recommandé de diriger l’utilisateur vers la page Paramètres de confidentialité de l’appareil photo et d’activer potentiellement l’accès pour votre application. La page Paramètres de confidentialité de l’appareil photo peut être lancée à l’aide de l’URI ms-settings:privacy-webcam.

L’exemple suivant montre comment rechercher E_ACCESSDENIED lors de l’appel de 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"));
}

L’exemple suivant illustre la gestion de l’erreur E_ACCESSDENIED retournée par IMFActivate ::ActivateObject lors de l’initialisation d’un IMFMediaSource pour un appareil de capture.

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

Implémenter le comportement de secours

Les applications doivent implémenter les étapes précédentes pour alerter l’utilisateur et avertir l’utilisateur que l’accès à la caméra est limité en raison des paramètres de confidentialité et de diriger l’utilisateur vers la page Paramètres de confidentialité de l’appareil photo pour lui permettre de mettre à jour ses paramètres. Après ces étapes, l’application doit réessayer l’initialisation de la caméra pour voir si l’accès a été accordé. Si l’utilisateur refuse de mettre à jour ses paramètres pour permettre à votre application d’accéder à la caméra, envisagez de fournir d’autres fonctionnalités. Par exemple, vous pouvez désactiver les fonctionnalités de l’appareil photo, basculer vers un autre mode ou afficher une image d’espace réservé à la place de l’aperçu de l’appareil photo.