Vb.net 在.net桌面应用程序中访问Windows 10上的位置

Vb.net 在.net桌面应用程序中访问Windows 10上的位置,vb.net,gps,location,windows-10-desktop,Vb.net,Gps,Location,Windows 10 Desktop,我工作的公司有一个应用程序,我们的现场工作人员使用该应用程序定期注册他们的GPS位置,我们最初使用System.Device.location GeoCoordinateWatcher类为windows 8 x86编写该应用程序 在windows 10中,相同的代码停止正常运行,GeoCoordinateWatcher.Permission返回已授予的权限,但每次调用我们都会继续收到未知位置。windows 8和windows 10平板电脑都有LTE Public Function Ge

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

在windows 10中,相同的代码停止正常运行,GeoCoordinateWatcher.Permission返回已授予的权限,但每次调用我们都会继续收到未知位置。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或初始化,位置始终未知

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


是否有人对如何排除正在发生的故障有任何建议?

查看您的函数后,我假设您没有在位置更改时调用实际get的处理程序。此事件为
PositionChanged事件
,当位置数据的纬度或经度发生更改时触发此事件

我建议将
watcher
的声明更改为类级变量,并将其设置为
with events
。例如

 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程序中更改了位置,但经过大量的现场测试后发现,在这种情况下,启动观察程序并读取一次比启动并捕获位置更改事件要可靠得多。不过,我会尝试一下,因为新的操作系统更改可能会使这种平衡偏离另一个方向。