C# UWP用户友好的方法,用于检查用户是否仅授予相机权限

C# UWP用户友好的方法,用于检查用户是否仅授予相机权限,c#,uwp,permissions,C#,Uwp,Permissions,我看到了这个问题,并尝试了基于它的实现: private async Task<bool> CameraPermissionCheck() { MediaCapture _mediaCapture = new MediaCapture(); try { await _mediaCapture.InitializeAsync(); return true; } catch (UnauthorizedAccessEx

我看到了这个问题,并尝试了基于它的实现:

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....");
    }
}
专用异步任务CameraPermissionCheck()
{
MediaCapture _MediaCapture=新的MediaCapture();
尝试
{
wait_mediaCapture.InitializeAsync();
返回true;
}
捕获(未经授权的访问例外)
{
返回false;
}
}
私有异步void docamerastaff()
{
bool cameraAllowed=等待CameraPermissionCheck();
如果(允许拍照)
{
//做事。。。。
}
其他的
{
ShowMessage(“无法执行操作,因为相机权限被拒绝。授予他们…”);
}
}
但是,
MediaCapture.InitializeAsync()
需要
网络摄像头
麦克风
权限。我所做的一切都不需要捕获音频,而我使用的图像库(ZXing)只需要
网络摄像头
;因此,这个解决方案并不理想,因为它要求清单请求用户单击“是”以获得我的应用程序不需要且永远不会使用的权限

我所做的一切都不需要捕获音频,我使用的图像库(ZXing)只需要网络摄像头

在UWP应用程序中,如果您需要使用,通常有两种方法。一种是使用
MediaCapture
。正如您所提到的,
MediaCapture.InitializeAsync()
需要
网络摄像头
麦克风
权限

另一种方法是使用。如果您使用的是
CameraCaptureUI
,则不应在应用程序清单文件中指定
网络摄像头
麦克风
功能。这是因为Windows内置摄像头应用程序是受信任的第一方应用程序,需要用户按下按钮启动照片、音频和视频捕获

您使用的库
Zxing.Net.Mobile
使用的是第一种方式,
MediaCapture
。如果只想指定与链接的示例相同的
网络摄像头
功能,则需要将设置为“仅视频”。例如:

_mediaCapture = new MediaCapture();
try
{ 
    await _mediaCapture.InitializeAsync(new MediaCaptureInitializationSettings
    {
        StreamingCaptureMode = StreamingCaptureMode.Video 
    });
    _isInitialized = true;
}
catch (UnauthorizedAccessException ex)
{
    Debug.WriteLine("The app was denied access to the camera");
}

据我所知,问题是它返回时有一个异常,而不是阻塞,直到用户做出选择?@Christopher Correct免责声明:我对UWP几乎没有经验。也就是说,InitializeAsync的文档非常具体,应该只从主/原始/UI线程调用它。“IndialIsAsIsCyc将启动一个同意提示,以获得用户对应用程序访问麦克风或照相机的许可。应该从应用程序的主UI线程调用IrimalIsAsIsCyc。在使用C或C++的应用程序中,MealAcActhION对象调用SimulalIsAcsiNC的第一个应用应该在STA线程上。你在使用任何形式的多线程吗?我是从主/唯一的UI线程调用的。从其他地方调用只需要是UI线程的内容将生成另一个异常。“InitializeAsync()检查立即返回false,而不是等待用户单击“是”或“否”提示。”这不应该发生。此方法将等待升级UI返回值。显示更多代码片段,并检查代码中是否缺少
wait
关键字。如果我从我的应用程序中删除
webcam
权限并重新运行它(从VS)然后尝试启动ZXing,我没有收到摄像头权限提示,ZXing会进入相同的“显示白色屏幕而不是摄像头中的任何视频”状态,如果我在清单中请求摄像头,但在提示中单击“否”。“我没有收到摄像头权限提示”如预期,如果您使用的是
CameraCaptureUI
您不需要授予我在回复中已经提到的权限。“ZXing将进入相同的‘显示白色屏幕’,您需要提供您的相关代码spinet。。直到现在,您还没有提供任何有关使用相机的代码片段。再次查看我的回复,谢谢。ZXing确实需要工作许可。在这里尝试官方的UWP样本。它在清单中请求
网络摄像头
权限,如果您从应用程序中删除该权限,则提示将消失,您将获得分配的任何覆盖,而无需摄像头输入,这几乎是自定义覆盖子示例中的纯白色屏幕,我的应用程序将其用作模板@丹尼利,现在我知道你想要什么了。我更新了我的回复以提供新的解决方案,这应该正是您想要的。很抱歉,开始的时候弄错了。如果您的应用程序最初启动时没有网络摄像头权限,然后您后来又去添加它们,那么有时不会显示同意提示。重置允许网络摄像头的权限的唯一方法是通过“应用程序设置”进入-