【问题标题】:Accessing Location on Windows 10 in .net desktop application在 .net 桌面应用程序中访问 Windows 10 上的位置
【发布时间】:2016-04-19 17:59:42
【问题描述】:

我工作的公司有一个由我们的现场工作人员使用的应用程序,它定期注册他们的 GPS 位置,我们最初使用 System.Device.Location GeoCoordinateWatcher 类为 Windows 8 x86 编写了该应用程序。

在 Windows 10 中,相同的代码无法正常运行,GeoCoordinateWatcher.Permission 返回 Granted,但每次调用我们仍会收到未知位置。 Windows 8 和 Windows 10 平板电脑都支持 LTE。

    Public Function GetLocation() As GeoCoordinate
         Dim geoCoordinate As GeoCoordinate
         Dim watcher As GeoCoordinateWatcher
         watcher = New GeoCoordinateWatcher(GeoPositionAccuracy.High)
         watcher.TryStart(False, TimeSpan.FromMilliseconds(15000))

         LogToFile("Position Permission: " & watcher.Permission.ToString)
         LogToFile("Watcher Status: " & watcher.Status.ToString)

         geoCoordinate = watcher.Position.Location

         If geoCoordinate.IsUnknown Then
             LogToFile("Unknown")
         Else
             LogToFile(String.Format("Lat: {0}, Long: {1}, H Accuracy: {2}, V Accuracy: {3}, Crse: {4}, Spd: {5}, Alt: {6}", geoCoordinate.Latitude, geoCoordinate.Longitude, geoCoordinate.HorizontalAccuracy, geoCoordinate.VerticalAccuracy, geoCoordinate.Course, geoCoordinate.Speed, geoCoordinate.Altitude))

         End If
         Return geoCoordinate
     End Function

我们的日志文件显示我们获得许可的每个调用,混合状态 = NoData 或 Initializing,并且位置始终未知。

我们确实在平板电脑上收到应用程序正在访问位置信息的通知,并且我可以确认 GPS 确实在工作,因为内置地图应用程序正确显示了当前 GPS 位置。

是否有人对尝试解决正在发生的事情有什么建议?

【问题讨论】:

    标签: vb.net gps location windows-10-desktop


    【解决方案1】:

    查看您的函数后,我会假设您没有在位置更改时调用实际 get 的处理程序。该事件为PositionChanged Event(please see here),当位置数据的经纬度发生变化时触发。

    我建议将watcher 的声明更改为类级别变量,并将其设为WithEvents。比如……

     Private WithEvents watcher As GeoCoordinateWatcher
    

    现在您可以访问该类的所有其他方法和函数。您的作为位置更改回调的事件将如下所示。

    Private Sub watcher_PositionChanged(ByVal sender As Object, ByVal e As GeoPositionChangedEventArgs(Of GeoCoordinate))
       'here you have access to latitude and longitude coordinates for example...
      'e.Position.Location.Altitude etc...   
    End Sub     
    

    所以一切都结束了......

     Private WithEvents watcher As GeoCoordinateWatcher'declare outside of function....
    
     Public Sub StartLocation()
             watcher = New GeoCoordinateWatcher(GeoPositionAccuracy.High)
             AddHandler watcher.PositionChanged, AddressOf watcher_PositionChanged
             watcher.Start(False, TimeSpan.FromMilliseconds(15000))
     End Sub
    
     Private Sub watcher_PositionChanged(ByVal sender As Object, ByVal e As GeoPositionChangedEventArgs(Of GeoCoordinate))
           LogToFile("Position Permission: " & watcher.Permission.ToString)
           LogToFile("Watcher Status: " & watcher.Status.ToString)
    
          e.* 'whatever you need here...
     End Sub
    

    【讨论】:

    • 你确实是对的,我们最初在我们原来的 windows 8 程序中使用了 PositionChanged,但是经过大量的现场测试发现,在那种情况下,启动 watcher 和读取一次比启动更可靠并捕捉位置变化的事件。不过我会试一试,因为新的操作系统更改可能会使这种平衡偏离另一个方向。
    猜你喜欢
    • 2014-11-29
    • 1970-01-01
    • 2017-09-16
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多