Android中获取卫星信息的接口有两类:
一、GpsStatus
注意:此类在API级别24中已被弃用。
请使用GnssStatus
和GnssStatus.Callback
。
这个类表示GPS引擎的当前状态。该类与 GpsStatus.Listener
接口配合使用。
方法:
获取卫星信息:
private GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() {@Overridepublic 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卫星状态@Overridepublic void onSatelliteStatusChanged(GnssStatus status) {//总数量hhstar1 = status.getSatelliteCount();//如果卫星总数大于0if (status != null && status.getSatelliteCount() > 0) {//循环遍历卫星for (int i = 0; i < status.getSatelliteCount(); i++) {int id = status.getSvid(i); //卫星idfloat 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
Android - GPS的简单应用_android获取gps信息-CSDN博客
https://juejin.cn/post/7144313606329335815