【发布时间】:2018-05-29 14:50:18
【问题描述】:
我看过this的问题,并尝试了基于它的实现:
private async Task<bool> CameraPermissionCheck()
{
MediaCapture _mediaCapture = new MediaCapture();
try
{
await _mediaCapture.InitializeAsync();
return true;
}
catch (UnauthorizedAccessException ex)
{
return false;
}
}
private async void DoCameraStuff()
{
bool cameraAllowed = await CameraPermissionCheck();
if (cameraAllowed)
{
//DO Stuff....
}
else
{
ShowMessage("Can't Do Stuff because camera permission is denied. To grant them....");
}
}
但是MediaCapture.InitializeAsync() 需要Webcam 和Microphone 权限。我所做的一切都不需要捕获音频,而我正在使用的成像库(ZXing)只需要Webcam;所以这个解决方案不太理想,因为它需要清单来请求用户单击“是”来获得我的应用程序不需要并且永远不会使用的权限。
【问题讨论】:
-
据我了解,问题是它返回时并没有出现异常,而是在用户做出选择之前一直阻塞?
-
@Christopher 正确
-
免责声明:我对 UWP 几乎没有经验。也就是说,InitializeAsync 的文档非常具体,它只能从 Primary/Original/UI 线程调用。 “InitializeAsync 将启动同意提示,以获取用户对应用程序访问麦克风或摄像头的权限。应从应用程序的主 UI 线程调用 InitializeAsync。在使用 C# 或 C++ 的应用程序中,首先使用 MediaCapture 对象调用 InitializeAsync 应该在 STA 线程上。从 MTA 线程调用可能会导致未定义的行为。您是否使用任何形式的多线程?
-
我从主/唯一 UI 线程调用。从其他地方调用只需要作为 UI 线程的东西会产生不同的异常。
-
" InitializeAsync() 检查立即返回 false,而不是等待用户在提示中单击是或否。" 这不应该发生。这个方法会等到promote UI有值返回。显示更多您的代码 sn-p,并检查您的代码中是否缺少
await关键字。
标签: c# uwp permissions