首页 > 解决方案 > 设置地理围栏时出现 UWP/C#“访问被拒绝”异常

问题描述

我有一个 .NET 5 控制台应用程序,我在文档“.NET 5:使用目标框架名字对象选项”之后使用了该应用程序。这意味着我的项目文件目前看起来像这样:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows10.0.18362</TargetFramework>
  </PropertyGroup>

</Project>

然后我尝试使用new Geolocator().GetGeopositionAsync()按预期工作的 Location Api。据我了解,只有当我的应用程序具有包标识时,我才能使用某些 UWP API。所以我创建了一个应用程序打包项目,将我的控制台应用程序引用为应用程序。我按照文档将整个项目打包为 msix 包。现在效果很好,我仍然可以按预期访问当前的地理位置。

但是,我遵循了在 UWP 中设置地理围栏的文档,一旦我尝试注册地理围栏甚至为触发的地理围栏注册事件处理程序,我就会得到一个

One or more errors occurred. (Access is denied. (0x80070005 (E_ACCESSDENIED)))

例外。我在清单文件中的功能定义如下:

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="runFullTrust" />
    <DeviceCapability Name="location"/>
  </Capabilities>

在我尝试设置地理围栏或注册事件处理程序之前,我总是调用await Geolocator.RequestAccessAsync()并且只有在此方法每次都返回 Allowed 时才继续执行该操作。这意味着这个问题的答案对我没有帮助。

是否有可能确保我定义能力的方式没有问题?例如,有没有办法在运行时检查我的能力?到目前为止,我没有找到关于该主题的任何内容。或者我的主要假设是否存在问题,即一旦我的控制台应用程序具有包 ID,因为它被打包为 msix,我就可以访问我无法访问的地理围栏等功能?

在检查了我是否可以通过调用 I 访问该位置之后,await Geolocator.RequestAccessAsync()例如尝试执行以下代码:

GeofenceMonitor.Current.GeofenceStateChanged += this.OnGeofenceStateChanged;

并立即收到异常。

编辑:我现在也尝试在 UWP 应用程序中使用相同的代码。在那里,它就像一个魅力,我注意到我在执行时收到一个弹出窗口,RequestLocation要求我授予应用程序访问该位置的权限。我从未在我的控制台应用程序中收到过类似的弹出窗口。我认为这可能是因为缺少 UI 线程。

我现在还尝试使用 WPF 应用程序而不是控制台应用程序来测试是否缺少 UI 线程可能是问题所在。但是,我在 WPF 应用程序(当然也打包为 .msix)中遇到了与控制台应用程序相同的问题。

标签: c#uwplocationgeofence

解决方案


推荐阅读