GPS在很多Android设备上扮演很重要的角色.
幸运的是可以很方便的使其工作起来.
在这个教程里面我们将完成一个程序,它可以显示当前位置并显示卫星状态.
GPS功能被封装在GPS库里面.
因此我们首先要把这个库加入到引用里面:
与其相关的有种类型.最主要的是GPS.
GPS管理连接和事件. 第二个是Location. Location是一个结构,它保存着经度和纬度坐标的修正值,还有其它信息,例如方向, 高度等等.
有时出现得不到所有的信息(例如,信号比较弱).
Location也包含其他功能,例如计算与另外一个Location的距离和方位,也包含转换坐标字符串格式的方法.
一般来说,你要处理通过LocationChanged事件传递进来的Location对象.当然,你也可以自己初始化这样的对象(这在计算不同位置的距离和方位时非常有用).
最后一个类型是GPSSatellite.它也是一个结构,其保存当前识别的卫星的各种信息.它是通过GPSStatus事件传递给你的.
回到GPS.
GPS对象应该被定义成 Process_Global 对象.否则当activity重建时会建立一个新的实例.
第一步是初始化对象.像其它初始化方法一样,它需要一个EventName参数. 这是完成GPS 对象事件的前缀.
下面是完整的代码:
下一步是通知GPS开始侦听数据. GPS会消耗很多电量的.因此建议当你不使用的时候把它关掉.建议在Activity_Resume里面开始侦听并在Activity_Pause里面停止侦听.
很多情况下,用户会关闭GPS. 由于考虑到隐私,Android OS不允许在程序里打开GPS.最好的办法就是请用户打开GPS设备.
下面的代码作用是如果GPS没有打开的话,就会显示一个信息,并打开GPS 控制面板,以便用户直接可以选上GPS选项:
一旦 GPS打开后,就开始侦听数据.Start方法使用两个值,一个是最小时间(毫秒),一个是最小距离 ,它们是用来决定触发时间的最小间隔,达到任意一个条件后,就会触发事件. 这个可以用来节省电量.
在这里,我们都设置为0,以便可以接受所有的固定事件.
GPS触发三个事件:
- GPS_LocationChanged (Location1 As Location)
这是主事件,Location1包括新的修正的值.
-GPS_GpsStatus (Satellites As List)
这个事件显示当前搜到的卫星的信息. 请注意,不是所有的卫星被用来计算最后的修正值. 因此即就是这个列表有好几个卫星,仍有可能接受到的数据不够计算修正值.
- GPS_UserEnabled (Enabled As Boolean)
T一旦用户改变了GPS 设备的状态,就会触发这个事件. 同时当调用Start后就会立即触发这个事件.
.
附件在这里
GPS.zip (6.3 KB, 462 views)
幸运的是可以很方便的使其工作起来.
在这个教程里面我们将完成一个程序,它可以显示当前位置并显示卫星状态.
GPS功能被封装在GPS库里面.
因此我们首先要把这个库加入到引用里面:
与其相关的有种类型.最主要的是GPS.
GPS管理连接和事件. 第二个是Location. Location是一个结构,它保存着经度和纬度坐标的修正值,还有其它信息,例如方向, 高度等等.
有时出现得不到所有的信息(例如,信号比较弱).
Location也包含其他功能,例如计算与另外一个Location的距离和方位,也包含转换坐标字符串格式的方法.
一般来说,你要处理通过LocationChanged事件传递进来的Location对象.当然,你也可以自己初始化这样的对象(这在计算不同位置的距离和方位时非常有用).
最后一个类型是GPSSatellite.它也是一个结构,其保存当前识别的卫星的各种信息.它是通过GPSStatus事件传递给你的.
回到GPS.
GPS对象应该被定义成 Process_Global 对象.否则当activity重建时会建立一个新的实例.
第一步是初始化对象.像其它初始化方法一样,它需要一个EventName参数. 这是完成GPS 对象事件的前缀.
下面是完整的代码:
B4X:
Sub Process_Globals
Dim GPS1 As GPS
End Sub
Sub Globals
Dim lblLon As Label
Dim lblLat As Label
Dim lblSpeed As Label
Dim lblSatellites As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
If FirstTime Then
GPS1.Initialize("GPS")
End If
Activity.LoadLayout("1")
End?Sub
Sub Activity_Resume
If GPS1.GPSEnabled = False Then
ToastMessageShow("Please enable the GPS device.", True)
StartActivity(GPS1.LocationSettingsIntent) 'Will open the relevant settings screen.
Else
GPS1.Start(0, 0) 'Listen to GPS with no filters.
End If
End Sub
Sub Activity_Pause (UserClosed As Boolean)
GPS1.Stop
End Sub
Sub GPS_LocationChanged (Location1 As Location)
lblLat.Text = "Lat = " & Location1.ConvertToMinutes(Location1.Latitude)
lblLon.Text = "Lon = " & Location1.ConvertToMinutes(Location1.Longitude)
lblSpeed.Text?= "Speed = " & Location1.Speed
End Sub
Sub GPS_UserEnabled(Enabled As Boolean)
ToastMessageShow("GPS device enabled = " & Enabled, True)
End?Sub
Sub GPS_GpsStatus (Satellites As List)
lblSatellites.Text = "Satellites:" & CRLF
For i = 0 To Satellites.Size - 1
Dim Satellite As GPSSatellite
Satellite = Satellites.Get(i)
lblSatellites.Text = lblSatellites.Text & CRLF & Satellite.Prn & _
" " & Satellite.Snr & " " & Satellite.UsedInFix & " " & Satellite.Azimuth _
& " " & Satellite.Elevation
Next
End Sub
很多情况下,用户会关闭GPS. 由于考虑到隐私,Android OS不允许在程序里打开GPS.最好的办法就是请用户打开GPS设备.
下面的代码作用是如果GPS没有打开的话,就会显示一个信息,并打开GPS 控制面板,以便用户直接可以选上GPS选项:
B4X:
Sub Activity_Resume
If GPS1.GPSEnabled = False Then
ToastMessageShow("Please enable the GPS device.", True)
StartActivity(GPS1.LocationSettingsIntent) 'Will open the relevant settings screen.
Else
GPS1.Start(0, 0) 'Listen to GPS with no filters.
End If
End Sub
在这里,我们都设置为0,以便可以接受所有的固定事件.
GPS触发三个事件:
- GPS_LocationChanged (Location1 As Location)
这是主事件,Location1包括新的修正的值.
-GPS_GpsStatus (Satellites As List)
这个事件显示当前搜到的卫星的信息. 请注意,不是所有的卫星被用来计算最后的修正值. 因此即就是这个列表有好几个卫星,仍有可能接受到的数据不够计算修正值.
- GPS_UserEnabled (Enabled As Boolean)
T一旦用户改变了GPS 设备的状态,就会触发这个事件. 同时当调用Start后就会立即触发这个事件.
.
附件在这里