Aracılığıyla paylaş


Windows kamera gizlilik ayarını işleme

Windows, kullanıcıların Windows Ayarları uygulamasında, Gizlilik & Güvenliği -> Kameraaltında cihazın kamerasına erişim izni vermesine veya reddetmesine izin verir. Kamera erişimi tüm cihaz için, paketlenmemiş tüm uygulamalar veya tek tek paketlenmiş uygulamalar için devre dışı bırakılabilir. Bu makalede, uygulamanızın kameraya erişimi olup olmadığını denetlemeye ve kullanıcı tarafından erişimin reddedildiği olayı işlemeye yönelik en iyi yöntemler açıklanmaktadır.

Kamerayı başlatmadan önce erişimi denetleyin

Paketlenmiş uygulamalar için, kamerayı başlatmadan önce uygulamanızın kamera erişimi olup olmadığını denetlemeniz gerekir. Uygulamanızın erişimi olup olmadığını belirlemek için AppCapability sınıfını kullanın.

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

Erişim reddedildi hatasını işleme

Windows kamera yakalama API'leri, kullanıcı kamera gizlilik Ayarları sayfasında kamerayı devre dışı bırakmışsa uygulamalar kamera yakalama cihazına erişmeye çalıştığında hata E_ACCESSDENIED döndürür. Uygulamalar yakalama cihazını başlatırken bu hatayı denetlemelidir. Başlatma işlemi bu hatayla başarısız olursa, kullanıcıyı kamera gizlilik Ayarları sayfasına yönlendirmeniz ve uygulamanız için erişimi etkinleştirmeniz önerilir. Kamera gizlilik Ayarları sayfası URI ms-settings:privacy-webcamkullanılarak başlatılabilir.

Aşağıdaki örnek, MediaCapture.InitializeAsyncçağrılırken E_ACCESSDENIED hatasının nasıl kontrol edileceğini göstermektedir.

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

Aşağıdaki örnek, bir yakalama cihazı için bir IMFMediaSource başlatılırken IMFActivate::ActivateObject'den döndürülen E_ACCESSDENIED hatasının nasıl ele alınacağını göstermektedir.

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

Geri dönüş davranışını uygulama

Uygulamalar, kullanıcıyı kamera erişiminin gizlilik ayarları nedeniyle kısıtlandığını algılayıp uyarır ve ayarlarını güncelleştirmesine izin vermek üzere kullanıcıyı kamera gizliliği Ayarları sayfasına yönlendirmek için önceki adımları uygulamalıdır. Bu adımlardan sonra, erişim verilip verilmediğini görmek için uygulamanın kamera başlatmayı yeniden denemesi gerekir. Kullanıcı, uygulamanızın kameraya erişmesine izin vermek için ayarlarını güncellemeyi reddederse alternatif işlevler sağlamayı göz önünde bulundurun. Örneğin, kamera özelliklerini devre dışı bırakabilir, farklı bir moda geçebilir veya kamera önizlemesinin yerine yer tutucu bir görüntü görüntüleyebilirsiniz.