Android中获取卫星信息的接口有两类:
一、GpsStatus
注意:此类在API级别24中已被弃用。
请使用GnssStatus
和GnssStatus.Callback
。
这个类表示GPS引擎的当前状态。该类与 GpsStatus.Listener
接口配合使用。
方法:
获取卫星信息:
private GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() {
@Override
public void onGpsStatusChanged(int event) {
if (ActivityCompat.checkSelfPermission(myActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(myActivity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},300);
return;
}
switch (event) {
//第一次定位
case GpsStatus.GPS_EVENT_FIRST_FIX:
Log.i("AndroidGPS","第一次定位");
iClockTag=0;//这时其实已经定位成功了
GpsStatus gpsStatusA = locManager.getGpsStatus(null);
int costTime=gpsStatusA.getTimeToFirstFix();
MyLog.i("AndroidGPS","启动到第一次定位时间:"+costTime);
MyLog.i("AndroidGPS","第一次定位时的"+sCurGPStimeShow);
break;
//定位启动
case GpsStatus.GPS_EVENT_STARTED:
Log.i("AndroidGPS","定位启动");
break;
//定位结束
case GpsStatus.GPS_EVENT_STOPPED:
Log.i("AndroidGPS","定位结束");
break;
//卫星状态改变
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
//获取当前状态
GpsStatus gpsStatus = locManager.getGpsStatus(null);
//获取卫星颗数的默认最大值
int maxSatellites = gpsStatus.getMaxSatellites();
//获取所有的卫星
Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator();
//卫星颗数统计
int count = 0;
StringBuilder sb = new StringBuilder();
// showStatus(iters,maxSatellites);
while (iters.hasNext() && count <= maxSatellites) {
GpsSatellite s = iters.next();
if (s.getSnr() > 0) {//信噪比不为0才算
count++;
//卫星的信噪比
String snr = "信噪比:" + s.getSnr();
String azi = ",方位角:" + s.getAzimuth();
String ele = ",高度:" + s.getElevation();
String hasalm = ",是否有年历:" + s.hasAlmanac();
String hasEph = ",是否有星历:" + s.hasEphemeris();
sb.append("第").append(count).append("颗,").append(snr).append(azi).append(ele).append(hasalm).append(hasEph).append("\n");
}
}
iSatellitesCount=count;
MyLog.e("AndroidGPS", sb.toString());
break;
default:
break;
}
}
二、GnssStatus
这个类表示GNSS引擎的当前状态。 本课程与GnssStatus.Callback
一起使用。
卫星星座类型常量:
方法:
其中:
获取卫星信息:(API>24)
@RequiresApi(api = Build.VERSION_CODES.N)
GnssStatus.Callback gnsscallback = new GnssStatus.Callback() {
//定期调用以报告GNSS卫星状态
@Override
public void onSatelliteStatusChanged(GnssStatus status) {
//总数量
hhstar1 = status.getSatelliteCount();
//如果卫星总数大于0
if (status != null && status.getSatelliteCount() > 0) {
//循环遍历卫星
for (int i = 0; i < status.getSatelliteCount(); i++) {
int id = status.getSvid(i); //卫星id
float DBHz = status.getCn0DbHz(i); //卫星信号强度
int type = status.getConstellationType(i); //卫星星座类型
float azimuthDegrees = status.getAzimuthDegrees(i); //卫星方位角
boolean infix = status.usedInFix(i); //卫星是否可用于定位
float elevationDegrees = status.getElevationDegrees(i); //卫星高程
boolean almanacData =status.hasAlmanacData(i); //卫星是否具有年历数据
boolean ephemerisData = status.hasEphemerisData(i); //卫星是否具有星历数据
}
}
}
}
};
三、接口区别
1、标识号不同
GpsSatellite:获取到的数据中,卫星号是PRN,每颗卫星都有一个唯一的PRN码,我们可以通过PRN码来确定它是什么类型的卫星,这里简单介绍一下:
1-32:GPS卫星
33-64:GPS的备用卫星和测试卫星
65-96:GLONASS卫星
193-200:QZSS卫星
201-261:北斗卫星
301-336:伽利略卫星
901-918:IRNSS卫星
GnssStatus:获取到的数据中没有PRN,但是它有一个Svid和ConstellationType,这个Svid不同的卫星有可能会重复,就是如果获取到两颗卫星,一颗GPS一颗北斗他们的Svid可能是一样的,所以无法判断它是哪种卫星,要通过获取数据中的ConstellationType来判断它是GPS还是北斗,下面介绍一下这个对象中北斗和GPS卫星的Svid范围和ConstellationType的常量
1-32:GPS卫星
1-37:北斗卫星
GnssStatus数据中,如果获取到的卫星号是1-32,那么它可能是GPS也有可能是北斗,所以还要获取ConstellationType数据也就是星座类型标识符
GPS: CONSTELLATION_GPS 常量值为1
北斗:CONSTELLATION_BEIDOU 常量值为5
2、信号值不同
GpsSatellite:信号值叫信噪比,单位是db
GnssStatus:信号值叫载噪比,单位是dB-Hz
参考链接:
https://www.apiref.com/android-zh/android/location/GnssStatus.html
https://www.apiref.com/android-zh/android/location/GnssStatus.Callback.html
https://www.apiref.com/android-zh/android/location/GpsSatellite.html