如何在WPF桌面应用中使用Geolocator.RequestAccessAsync

时间:2018-08-26 04:13:23

标签: c# wpf uwp geolocation desktop-bridge

我已经用C#构建了一个WPF应用程序,该应用程序需要知道用户的位置,并且当前需要手动输入。我正在使用Desktop Bridge使其能够作为UWP应用程序运行。当它作为UWP应用运行时,我想利用Windows 10位置API(如果已启用)的优势。我正在使用以下代码在程序启动时请求位置访问:

public static async void RequestAccess()
{
    var accessStatus = await Windows.Devices.Geolocation.Geolocator.RequestAccessAsync();

    switch (accessStatus)
    {
        case Windows.Devices.Geolocation.GeolocationAccessStatus.Allowed:
            UwpDesktop.hasLocationAccess = true;
            break;
        case Windows.Devices.Geolocation.GeolocationAccessStatus.Denied:
            UwpDesktop.hasLocationAccess = false;
            break;
        case Windows.Devices.Geolocation.GeolocationAccessStatus.Unspecified:
            MessageBox.Show("Failed to access Windows 10 location API", "Error");
            UwpDesktop.hasLocationAccess = false;
            break;
    }
}

但是,如果未为其启用位置权限,则在运行我的应用程序时出现以下错误:

  

System.Exception:'找不到元素。 (来自HRESULT的异常:0x80070490)'

据我所知,此错误的原因是RequestAccessAsync函数需要在UWP UI主线程中运行。之所以只会在未启用位置权限时发生,是因为Windows尝试启动UWP对话框,要求用户授予位置访问权限,但是在Desktop Bridge应用程序中却没有这样做。

我知道针对此问题的两种解决方案。一种方法是启动“设置”应用程序的“位置”部分,并向用户显示一个消息框,要求他们在该位置授予位置访问权限,这可能有效,但我真的更喜欢使用官方API。另一种选择是创建一个新的UWP代码项目并在其中编写此代码,然后从WPF应用程序运行它。

Microsoft有一些documentation应该用来解释如何执行第二种选择,但是它们的示例很复杂,我不知道如何将它们应用于我要尝试的操作。我不想创建XAML UI或后台服务,我所需要的只是一种安全调用RequestAccessAsync并根据结果返回值的方法。我想知道我是否真的需要创建一个UWP项目以使其按我想要的方式运行,或者最简单的方法是执行该操作。

0 个答案:

没有答案