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