0

0

Android GPS定位测试(附效果图和示例)

高洛峰

高洛峰

发布时间:2017-01-07 14:52:31

|

2575人浏览过

|

来源于php中文网

原创

今天因为工作需要,把以前编写的一个gps测试程序拿出来重新修改了一下。这个程序说起来有些历史了,是我11年编写的,那时候学了android开发没多久,算是一个实验性的作品。现在工作需要,重新拿出来修整。同时发现我对android的gps服务了解并不深,所以今天特意阅读了有关gps服务的一些资料,把相关知识点记录下来。

本人做了GPS相关的嵌入式软件已经几年了,所以说起要做个测试GPS定位模块的程序,第一反应就是串口读取GPS模块的数据,然后解析GPS的NMEA格式数据。NMEA是一种标准化数据格式,不仅仅GPS上应用了,其他一些工业通信也是使用这种标准化数据格式。解析相关数据然后显示出来,就完成了一个基本的GPS定位测试功能。

查了一下才发现Android上做GPS相关定位服务,不需要读取NMEA数据分析,Android已经封装好了相关服务,你要做的就是调用API。这个不知道应该觉得爽还是觉得纠结。(Android也提供了读取NMEA接口,下面会说到)

1、Android 定位服务
下面我们先来看看Android有关定位服务提供的支持:

Android GPS定位测试(附效果图和示例)

Android定位服务都是位于location下,上面都有相关说明,这里就不详细解析。有一点有需要说说的
是:GpsStatus.NmeaListener 官方的说法是可以读取NMEA数据,但是我这里测试发现,并没有读取到NMEA的数据。查阅过一些资料,说是google在底层并没有实现数据反馈的功能。有时间,需要查看一下源码。

2、LocationManager定位

//获取定位服务
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
//判断是否已经打开GPS模块
if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) 
{
  //GPS模块打开,可以定位操作      
}
// 通过GPS定位
String LocateType= locationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(LocateType);
// 设置监听器,设置自动更新间隔这里设置1000ms,移动距离:0米。
locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);
// 设置状态监听回调函数。statusListener是监听的回调函数。
locationManager.addGpsStatusListener(statusListener); 
//另外给出 通过network定位设置
String LocateType= locationManager.NETWORK_PROVIDER;
Location location = locationManager.getLastKnownLocation(LocateType);

3、GpsStatus监听器
上面给出了定位服务的初始化设置步骤,但我们都知道GPS卫星是定期广播数据的,也就是说会定期收到卫星的GPS数据。我们并不能跟卫星主动申请数据,只能被动接收数据。(中国的北斗2倒是可以发送卫星报文给卫星)因此我们需要注册一个监听器来处理卫星返回的数据。

private final GpsStatus.Listener statusListener = new GpsStatus.Listener() 
{
    public void onGpsStatusChanged(int event) 
  {
      // GPS状态变化时的回调,获取当前状态
      GpsStatus status = locationManager.getGpsStatus(null);
    //自己编写的方法,获取卫星状态相关数据
       GetGPSStatus(event, status);
    }
};

4、获取搜索到的卫星

private void GetGPSStatus(int event, GpsStatus status) 
{
    Log.d(TAG, "enter the updateGpsStatus()");
    if (status == null) 
    {
    } 
   else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) 
    {
     //获取最大的卫星数(这个只是一个预设值)
        int maxSatellites = status.getMaxSatellites();
        Iterator it = status.getSatellites().iterator();
        numSatelliteList.clear();
     //记录实际的卫星数目
        int count = 0;
        while (it.hasNext() && count <= maxSatellites) 
        {
       //保存卫星的数据到一个队列,用于刷新界面
            GpsSatellite s = it.next();
            numSatelliteList.add(s);
            count++;

            Log.d(TAG, "updateGpsStatus----count="+count);
        }
        mSatelliteNum = numSatelliteList.size();
     }
     else if(event==GpsStatus.GPS_EVENT_STARTED)
     {  
         //定位启动   
     }
     else if(event==GpsStatus.GPS_EVENT_STOPPED)
     {  
         //定位结束   
     }
}

上面就是从状态值里面获取搜索到的卫星数目,主要是通过status.getSatellites()实现。获取到的GpsSatellite对象,
保存到一个队列里面,用于后面刷新界面。上面是获取GPS状态监听器,除了GPS状态外,我们还需要监听一个服务,
就是:LocationListener,定位监听器,监听位置的变化。这个对做定位服务的应用来说,十分重要。

5、LocationListener监听器

private final LocationListener locationListener = new LocationListener() 
{
        public void onLocationChanged(Location location) 
     {
            //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
            updateToNewLocation(location);            
            Log.d(TAG, "LocationListener  onLocationChanged");
        }
        public void onProviderDisabled(String provider) 
     {
            //Provider被disable时触发此函数,比如GPS被关闭
            Log.d(TAG, "LocationListener  onProviderDisabled");
        }
        public void onProviderEnabled(String provider) 
     {
            // Provider被enable时触发此函数,比如GPS被打开
            Log.d(TAG, "LocationListener  onProviderEnabled");
        }
        public void onStatusChanged(String provider, int status, Bundle extras) 
     {
            Log.d(TAG, "LocationListener  onStatusChanged");
            // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
            if (status == LocationProvider.OUT_OF_SERVICE || status == LocationProvider.TEMPORARILY_UNAVAILABLE)       {    
            }
        }
    };

位置监听回调是用来处理GPS位置发生变化的时候,自动回调的方法,我们可以从这里获取到当前的GPS数据。另外我们可以通过回调函数提供的location参数,获取GPS的地理位置信息,包括经纬度、速度、海拔等信息。

6、获取地理位置信息(经纬度、卫星数目、海拔、定位状态)

//location对象是从上面定位服务回调函数的参数获取。
mLatitude = location.getLatitude();   // 经度
mLongitude = location.getLongitude();  // 纬度
mAltitude = location.getAltitude();   //海拔
mSpeed = location.getSpeed();       //速度
mBearing = location.getBearing();    //方向

7、获取指定卫星信息(方向角、高度角、信噪比)

Removal.AI
Removal.AI

AI移出图片背景工具

下载
//temgGpsSatellite就是我们上面保存的搜索到的卫星
//方向角
float azimuth = temgGpsSatellite.getAzimuth();
//高度角
float elevation = temgGpsSatellite.getElevation();
//信噪比
float snr = temgGpsSatellite.getSnr();

利用方向角、高度角我们可以绘画出一个二维图形,表示卫星在地球哪个方位,信噪比作用更大。一般的卫星定位测试软件,都提供了信噪比的状态图,这是表示GPS模块搜星能力的代表。

8、绘画二维卫星位置图
下面是我做的GPS测试的效果图:

Android GPS定位测试(附效果图和示例)

下面给出一个根据方向角和高度角,计算卫星二维图里面位置的方法,上面效果图左边的绿色圆点就代表卫星位置。

右边的信噪比柱状图,代表卫星的接收信号能力。

//根据方向角和高度角计算出,卫星显示的位置
Point point = new Point();
int x = mEarthHeartX; //左边地球圆形的圆心位置X坐标
int y = mEarthHeartY; //左边地球圆形的圆心位置Y坐标                       
int r = mEarthR;
x+=(int)((r*elevation*Math.sin(Math.PI*azimuth/180)/90));
y-=(int)((r*elevation*Math.cos(Math.PI*azimuth/180)/90));
point.x = x;
point.y = y;
//point就是你需要绘画卫星图的起始坐标

信噪比的绘画,就是一个单位换算,这里就不给代码了。

9、总结:
Android为我们提供了很方便的位置服务,主要通过GpsStatus、LocationManager、GpsSatellite这几个类实现相关服务和监听。

不过个人觉得如果能直接读取NMEA的数据也是很方便,起码对于某些应用来说,可以获取更多信息。

更多Android GPS定位测试(附效果图和示例)相关文章请关注PHP中文网!

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

34

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

UNI-APP开发(仿饿了么)
UNI-APP开发(仿饿了么)

共32课时 | 8.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号