basic4android 开发教程翻译(九)使用GPS

xalion

Member
Licensed User
Longtime User
GPS在很多Android设备上扮演很重要的角色.
幸运的是可以很方便的使其工作起来.
在这个教程里面我们将完成一个程序,它可以显示当前位置并显示卫星状态.

gps1.png


GPS功能被封装在GPS库里面.
因此我们首先要把这个库加入到引用里面:
gps2.png


与其相关的有种类型.最主要的是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开始侦听数据. GPS会消耗很多电量的.因此建议当你不使用的时候把它关掉.建议在Activity_Resume里面开始侦听并在Activity_Pause里面停止侦听.

很多情况下,用户会关闭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
一旦 GPS打开后,就开始侦听数据.Start方法使用两个值,一个是最小时间(毫秒),一个是最小距离 ,它们是用来决定触发时间的最小间隔,达到任意一个条件后,就会触发事件. 这个可以用来节省电量.
在这里,我们都设置为0,以便可以接受所有的固定事件.

GPS触发三个事件:
- GPS_LocationChanged (Location1 As Location)
这是主事件,Location1包括新的修正的值.

-GPS_GpsStatus (Satellites As List)
这个事件显示当前搜到的卫星的信息. 请注意,不是所有的卫星被用来计算最后的修正值. 因此即就是这个列表有好几个卫星,仍有可能接受到的数据不够计算修正值.

- GPS_UserEnabled (Enabled As Boolean)
T一旦用户改变了GPS 设备的状态,就会触发这个事件. 同时当调用Start后就会立即触发这个事件.

.
附件在这里
zip.gif
GPS.zip (6.3 KB, 462 views)
 

luochong

New Member
Licensed User
Longtime User
如何加载Type

我下载了GPS的demo,编译不了,提示若干数据类型不存在ByteConverter、FileDialog等,如何下载并安装这些type?
 
Top