获取原始NMEA 0183语句的方法

        MEA0183语句是从卫星上广播的含有丰富信息的原始GPS语句,它的语法为海用电子设备的标准格式。它所含的信息量远远不止位置坐标,开发和利用这些信息可能会带来意想不到的商机。比如,它发出的时间信息已经被很多钟表厂商利用,开发出了卫星授时钟表,让使用者再不用对表,随时都能得到标准时间。这篇小文不打算介绍如何开发它的利用,而是说说如何用手机读取它,实现从无到有的过程。

        

        android手机读取NMEA0183原始语句过程不是很复杂,总共需要4步,只要每步按要求走对了,就肯定能获得NMEA0183语句了。下面分别概述。

第一步是权限的获得,就是这两个权限:

        这两个权限在应用清单中声明,在写代码的时候,AS有时会要求你做权限检查,似乎有点多此一举。

第二步是监听,使用LocationListener()方法,当你声明它的时候,就会有4个回调方法:

获取原始NMEA 0183语句的方法_第1张图片

onLocationChanged(Location location)方法是在位置改变时回调位置的信息;

onProviderDisabled(String provider)当用户关闭了信息的提供者时会调用;onProviderEnabled(String provider)当用户打开了信息提供者的时候调用;onStatusChanged(String provider,int status,Bundle extras)这个方法在信息提供者的状态在可用,暂时不可用和无服务三个状态直接切换时被调用。服务停止的状态码为OUT_OF_SERVICE,如何服务停止,在短期内可恢复,状态码为TEMPORARILY_UNAVAILABLE,如果服务正常有效,状态码为AVAILABLE。实际上,我只看到过第1个方法回调的信息,其他的没见过。

        第三步是信息更新。一般情况下,位置的信息是个动态的信息,所以实时更新是位置信息的一个特点,在android中,位置信息的更新使用的是requestLocationUpdates(String provider,long mintime,float minDistance,LocatoinListener listener)方法,根据传入参数的不同它有5个变体,上面列出的常用的一种。第1个参数是位置信息的提供者,在获取NMEA0183时,我设置的是GPS_PROVIDER,第2个参数是最小时间间隔,这个要看APP的使用目的和使用者运动的速度了,NMEA0183原始语句的数据量大,时间间隔如果太短了设备有可能响应不及时。

第四步就是读取了。NMEA0183语句的读取方法虽然都是用addNmeaListener方法,但是根据设备的固件版本不同采用不同的读取模式,手机android版本API等级23-29的要用OnNmeaMessageListener()监听模式读取NMEA0183语句,这个是代码:

获取原始NMEA 0183语句的方法_第2张图片

手机android的API等级在15-28的可以用Nmealistener监听模式,也可以用GpsStatus.NmeaListener接口模式。用Nmealistener的代码如下图:

获取原始NMEA 0183语句的方法_第3张图片

用GpsStatus.NmeaListener接口模式的代码如下图:

获取原始NMEA 0183语句的方法_第4张图片

这几种方法我都试验过,感觉第1种方法比较可靠,它的连续性好,可以持续很长时间不间断地获取NMEA0183语句,低版本的方法虽然也能持续工作很长时间,但有时会有间断。如果版本23以上,推荐使高版本的方法。另外,如果要想连续不断的获得NMEA0183语句,定期激活更新方法能取得较好的效果。在这里我要感谢doris_d大神,他的经验和提示解决了我在读取方法与固件版本方面的困惑!

你可能感兴趣的:(定位,GPS,获取)