共用方式為


處理 Windows 相機隱私權設定

Windows 可讓使用者在 [隱私權與安全性 -> 相機] 底下的 [Windows 設定] 應用程式中授與或拒絕裝置相機的存取權。 您可以針對整個裝置、所有未封裝的應用程式,或個別封裝的應用程式停用相機存取。 本文說明檢查您的應用程式是否可以存取相機,並處理使用者拒絕存取案例的最佳做法。

在初始化相機之前,請先檢查存取權

針對已封裝的應用程式,您應該先檢查您的應用程式是否具有相機存取權,再初始化相機。 使用AppCapability類別來判斷您的應用程式是否具有存取權。

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

處理拒絕存取錯誤

如果使用者已在相機隱私權設定頁面中停用相機,Windows 相機擷取 API 會在應用程式嘗試存取相機擷取裝置時,傳回錯誤 E_ACCESSDENIED 。 應用程式應該在初始化擷取裝置時檢查此錯誤。 如果初始化失敗並出現此錯誤,建議您將使用者導向相機隱私權設定頁面,並可能啟用應用程式的存取權。 您可以使用 URI ms-settings:privacy-webcam啟動相機隱私權設定頁面。

下列範例說明如何在呼叫 MediaCapture.InitializeAsync 時檢查E_ACCESSDENIED。

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

下列範例說明在初始化擷取裝置的IMFMediaSource時,處理從IMFActivate::ActivateObject 傳回的E_ACCESSDENIED錯誤。

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

實作後援行為

應用程式應實作先前的步驟,以警示用戶偵測並警示使用者相機存取受限,因為隱私權設定,並將使用者導向相機隱私權設定頁面,以允許他們更新其設定。 在這些步驟之後,應用程式應該重試相機初始化,以查看是否已授與存取權。 如果使用者拒絕更新其設定,以允許您的應用程式存取相機,請考慮提供替代功能。 例如,您可以停用相機功能、切換至不同的模式,或顯示佔位元影像來取代相機預覽。