【问题标题】:UWP Userfriendly way to check if the user has granted only camera permissionsUWP 用户友好的方式来检查用户是否仅授予相机权限
【发布时间】: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() 需要WebcamMicrophone 权限。我所做的一切都不需要捕获音频,而我正在使用的成像库(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


【解决方案1】:

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

在UWP应用中,如果需要使用Camera,一般有两种方式。一种是使用MediaCapture。正如您所提到的,MediaCapture.InitializeAsync() 需要 webcammicrophone 权限。

另一种方法是使用windows built-in camera UI。如果您使用CameraCaptureUI,则不应在应用清单文件中指定webcammicrophone 功能。这是因为Windows 内置相机应用是受信任的第一方应用,需要用户启动照片、音频和视频捕获,只需按下按钮。

您正在使用的库Zxing.Net.Mobile 正在使用第一种方式,MediaCapture。如果您只想指定与您链接的示例相同的WebCam 功能,则需要将MediaCaptureInitializationSettings 设置为仅视频。例如:

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

【讨论】:

  • 如果我从我的应用程序中删除 webcam 权限并重新运行它(从 VS)并尝试启动 ZXing 我没有得到相机权限提示并且 ZXing 进入相同的“显示白色”如果我在清单中请求摄像头但在提示中单击“否”,则会收到来自摄像头状态的任何视频。
  • “我没有得到相机权限提示”这是预期的,如果您使用CameraCaptureUI,则不需要我在回复中提到的授予权限。 “ZXing同样‘显示白屏’,你需要提供你的相关代码spinet..直到现在你没有提供任何代码sn-p relative来使用相机。再次查看我的回复,谢谢。
  • ZXing确实需要权限才能工作。在此处尝试官方 UWP 示例。它在清单中请求webcam 权限,如果您从应用程序中删除权限,提示就会消失,并且您会在没有相机输入的情况下获得分配的任何覆盖,这在自定义覆盖子示例中几乎是一个纯空白屏幕是我的应用程序用作模板的内容。 github.com/Redth/ZXing.Net.Mobile/tree/master/Samples/…
  • @DanNeely,现在我知道你想要什么了。我更新了我的回复以提供新的解决方案,这应该正是您想要的。很抱歉一开始听错了。
  • 如果您的应用程序最初没有网络摄像头权限,然后您稍后再添加它们,则有时不会显示同意提示。重置权限以允许网络摄像头的唯一方法是通过“应用程序设置”-howtogeek.com/368598/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多