上次我们有说到使用手机自带的GPS进行定位操作。这一次我们要说说关于搜星的问题。我们都知道,我们的GPS定位是依赖于全球卫星导航系统。而现在通行的全球卫星导航主要是三家,美国的GPS,俄罗斯的格洛纳斯,还有就是我们国家的北斗卫星导航。那我们今天就看看如何知道当前手机可以搜到多少卫星。
要想获取到填上的卫星信息,得调用定位管理器LocationManager对象的addGpsStatusListener方法添加定位状态监听器,该监听器需实现GpsStatus.Listener接口的onGpsStatusChanged方法,该方法提供了定位状态变化的事件信息,事件类的取值见下表
GpsStatus类的事件类型 | 说明 |
GPS_EVENT_STARTED | GPS功能开启 |
GPS_EVENT_STOPPED | GPS功能停止 |
GPS_EVENT_FIRST_FIX | 首次定位 |
GPS_EVENT_SATELLITE_STATUS | 周期地报告卫星状态 |
最后一个卫星状态报告事件可以获得监测到的卫星信息,一旦捕获该事件,即可调用LocationManager对象的getGpsStatus方法获得当前的定位状态信息GpsStatus,再调用GpsStatus对象的getSatellites方法获得本地检测到的卫星列表。卫星列表是一个GpsSatellite队列,详细的卫星信息可通过GpsSatellite对象的以下方法获得。
- getPrn:获取卫星的伪随机码,可以认为是卫星的编号。
- getAzimuth:获取卫星的方位角。
- getElevation:获取卫星的仰角。
- getSnr:卫星的信噪比,即信号强弱。
- hasAlmanac:卫星是否有年历表。
- hasEphemeris:卫星是否有星历表。
- usedInFix:卫星是否被用于近期的GPS修正计算。
搜星的具体代码如下。这个要结合之前的卫星定位一起使用。
mLocationMgr.addGpsStatusListener(new GpsStatus.Listener() {
@Override
public void onGpsStatusChanged(int event) {
//获取卫星定位的状态信息
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
GpsStatus gpsStatus = mLocationMgr.getGpsStatus(null);
switch (event) {
case GpsStatus.GPS_EVENT_SATELLITE_STATUS://周期的报告卫星状态
if (!flag) {
//得到所有收到的卫星信息,包括卫星的广度角、方位角、信噪比和卫星编号
Iterable<GpsSatellite> satellitess = gpsStatus.getSatellites();
for (GpsSatellite satellite : satellitess) {
total++;
tv_count.setText("共有" + total + "颗卫星");
String appendStr = "";
if (satellite.getPrn() <= 64 || (satellite.getPrn() >= 120 && satellite.getPrn() <= 138)) {
appendStr = "美国1颗";
} else if (satellite.getPrn() >= 201 && satellite.getPrn() <= 237) {
appendStr = "北斗1颗";
} else if (satellite.getPrn() >= 65 && satellite.getPrn() <= 89) {
appendStr = "格洛纳斯1颗";
} else if (satellite.getPrn() >= 193 && satellite.getPrn() <= 194) {
appendStr = "未知";
}
tv_wx.append(appendStr + "\n");
}
flag = true;
}
break;
case GpsStatus.GPS_EVENT_FIRST_FIX://首次卫星定位
break;
case GpsStatus.GPS_EVENT_STARTED://卫星导航服务开始
break;
case GpsStatus.GPS_EVENT_STOPPED://卫星导航服务停止
break;
}
}
});
这样根据卫星伪代码就可以知道不同卫星是属于哪个国家的了。