2024-08-06升级记录:Android开发接口-获取定位卫星相关信息

Android中获取卫星信息的接口有两类:

一、GpsStatus

 注意:此类在API级别24中已被弃用。
 请使用GnssStatusGnssStatus.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

Android - GPS的简单应用_android获取gps信息-CSDN博客

https://juejin.cn/post/7144313606329335815

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值