一、
针对android项目中加速度传感检测手机方位,运行过程会时刻记录手机GPS的SRN详细数据,实时显示当前获取的卫星的PID和C/N,实时显示手机终端系统时间的需求,对于启动后台服务采集gps数据同时要把数据实时保存到本地文件中,要在gps状态改变时更新gps信息到界面上显示并且记录下来保存到本地的实时性冲突,对频繁读写文件还有界面更新不能让数据出现时间不连续。
在GPS项目的初始代码中逐步发现无法进行定时器更新执行,对界面显示数据的分离问题还有获取卫星列表失败、数据保存不连续等问题,造成获取gps信息不正常。
二、
在定时器无法更新执行任务的问题中原来代码使用AlarmManager服务,但是在设定重复任务的时候发现设定好了interval时间后,任务并没有按期望启动。从API 19开始,alarm的机制都是非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用。有一些新的API会支持严格准确的传递,见setWindow(int, long, long, PendingIntent)和setExact(int, long, PendingIntent)。targetSdkVersion在API 19之前应用仍将继续使用以前的行为,所有的闹钟在要求准确传递的情况下都会准确传递。setRepeating方法在 API 19开始将会失去原来的效果。可以换个定时器timer来使用重复执行任务,或者重复执行循环定时AlarmManager的设置。对于界面中时间显示和gps数据更新不在一个流程下,可以进行模块分离,单独更新对应控件显示。获取卫星列表信息失败,没有从gps状态监听器中获取,造成数据获取异常。需要在GpsStatus监听器的onGpsStatusChanged回调函数中的当卫星状态改变时来获取gps信息。获取gps信噪比数据不连续是因为服务被系统优化给杀死了,得保证采集数据的服务常驻不被系统停止。
三、
GPS是Android系统中重要的组成部分,通过它可以衍生出众多的与位置相关的应用。Android的GPS有一个专门的管理类,称为LocationManager,所有的GPS定位服务都由其对象产生并进行控制。首先需要明确的是,LocationManager类的对象获取并不是直接创建的,而是由系统提供的,具体来说,通过如下方法,为一个LocationManager对象建立一个对象引用:
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
至此,我们可以用locationManager这个对象对任意有关GPS的功能进行操作了。下表列出了几个常用的成员方法:getAllProviders获取所有与设备关联的定位模块的列表;getBestProvider获取设定的标准(Criteria对象)中最适合的一个设备;getGpsStatus获取GPS当前状态;getLastKnownLocation获取最近一次的可用地点信息;isProviderEnabled判断参数所提及的设备是否可用。
GPS还有一个支持API,即Location,它的作用是一个代表位置信息的抽象类,用它可以获取所有的位置数据。我们可以用以上的方法开始进行定位,可以将地点信息传递给一个Location对象:
Locationlocation = locationManager.getLastKnownLocation (LocationManager.GPS_PROVIDER);
我们还可以调用以下函数,对每次更新的位置信息进行我们想要的操作:
locationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER,1000, 10, new LocationListener())
其中,第一个参数是LocationProvider对象,第二个参数是刷新的时间差,这里设定为1秒,第三个参数是位置差,这里设定为10米,第四个参数为一个位置监听器对象,可以重写这些方法来实现我们的需求。
大致流程就是首先通过LocationMangager位置管理器,要想操作定位相关设备,必须先定义个LocationManager。可以通过如下代码创建LocationManger对象。然后通过LocationListener位置监听器,可以监听位置变化,监听设备开关与状态。Location位置信息,通过Location可以获取时间、经纬度、海拔等位置信息。采用