Dela via


Hantera sekretessinställningen för Windows-kameran

Med Windows kan användare bevilja eller neka åtkomst till enhetens kamera i Windows-inställningar, under Sekretess och säkerhet –> Kamera. Kameraåtkomst kan inaktiveras för hela enheten, för alla icke-paketerade appar eller för individuella paketerade appar. Den här artikeln beskriver metodtipsen för att kontrollera om din app har åtkomst till kameran och hantera fallet där åtkomst nekas av användaren.

Kontrollera åtkomsten innan kameran initieras

För paketerade appar bör du kontrollera om appen har kameraåtkomst innan du initierar kameran. Använd klassen AppCapability för att avgöra om din app har åtkomst.

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

Hantera nekad åtkomst-fel

Windows-kamerainspelnings-API:erna returnerar felet E_ACCESSDENIED när appar försöker komma åt kamerainspelningsenheten om användaren har inaktiverat kameran på sidan Inställningar för kamerasekretess. Appar bör söka efter det här felet när avbildningsenheten initieras. Om initieringen misslyckas med det här felet rekommenderar vi att du dirigerar användaren till sidan Inställningar för kamerasekretess och eventuellt aktiverar åtkomst för din app. Sidan Inställningar för kamerasekretess kan startas med hjälp av URI ms-settings:privacy-webcam:n .

I följande exempel visas hur du söker efter E_ACCESSDENIED när du anropar 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"));
}

I följande exempel visas hur man hanterar E_ACCESSDENIED-felet som returneras från IMFActivate::ActivateObject när man initierar en IMFMediaSource för en bildinspelningsenhet.

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

Implementera återställningsbeteende

Appar bör implementera föregående steg för att varna användaren att identifiera och varna användaren om att kameraåtkomst begränsas på grund av sekretessinställningar och dirigera användaren till sidan inställningar för kamerasekretess så att de kan uppdatera sina inställningar. Efter de här stegen bör appen försöka initiera kameran igen för att se om åtkomst har beviljats. Om användaren inte vill uppdatera sina inställningar så att appen kan komma åt kameran kan du överväga att tillhandahålla alternativa funktioner. Du kan till exempel inaktivera kamerafunktioner, växla till ett annat läge eller visa en platshållarbild i stället för kameraförhandsgranskningen.