Android开发:基于原生API获取位置信息、卫星信号个数及参与定位的卫星个数

概述

最近在做室内外无缝定位的相关demo,室外定位中,GNSS定位方法具有精度高、成本低等优点,而且Android平台也提供了原生API用于定位,可以很方便地进行功能实现。GNSS定位方法理论上最少需要4颗卫星就能获取位置信息,因此,可以基于有效卫星数判断选择使用室内定位方法还是GNSS方法(即基于卫星数实现无缝切换功能)。
本文记录了使用Android原生API获取位置信息的方法、获取接收到的卫星信号个数的方法以及获取参与定位的卫星信号个数的方法。

权限申请及开启GPS

首先需要在AndroidManifest文件里面进行权限申请,代码如下:

<!-- rough location permission -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- fine location permission -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

从Android6.0开始,Google将权限分为正常权限与危险权限,危险权限需要在运行时再次向用户申请。位置信息属于危险权限,因此,需要在Activity里面对权限再次进行申请,具体代码如下:

// get location permission again
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0);
    return;
}

权限申请完成后,
注册一个LocationManager。LocationManager是Android官方提供的用于管理位置信息的一个类,该类提供对系统位置服务的访问。这些服务允许应用程序获得设备的地理位置的周期性更新,或者当设备接近一个给定的地理位置时得到通知。具体可以看官方文档。代码如下:

LocationManager mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

同时,确保移动设备开启GPS,方法代码如下:

void insureGPSisOpen(LocationManager locationManager) {
    // judge whether the GPS is open
    if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        Toast.makeText(getApplicationContext(), "请开启GPS导航...", Toast.LENGTH_SHORT).show();
        // trun to the GPS setting page
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivityForResult(intent, 0);
        return;
    }
    Log.d(TAG, "insureGPSisOpen");
    return;
}

之后,在onCreate()方法里调用上述子方法。

调用原生API进行定位

requestLocationUpdates(provider: String, minTimeMs: Long, minDistanceM: Float, listener: LocationListener)是LocationManager类的一个方法,该方法能够从给定的Provider中获取位置信息,并在位置更新时调用LocationListener(上述方法的第四个参数)的onLocationChanged()方法。LocationListener用于接收通知,当LocationListener已经注册到LocationManager且设备位置发生变化时,将调用LocationListener里的相关方法。
首先编写一个LocationListener的子类并重写其中的onLocationChanged()方法,具体代码如下:

LocationListener locationListener = new LocationListener() {
    @Override
    // callback func when the location changed
    public void onLocationChanged(@NonNull Location location) {
        mTvLatitude.setText("纬度:" + location.getLatitude());
        mTvLongitude.setText("经度:" + location.getLongitude());
        // change the flag, to record cur status
        Log.d(TAG, "onLocationChanged");
    }
};

然后将自定义的LocationListener注册到LocationManager中,具体代码如下:

mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 0,locationListener);

通过上述步骤就能获取位置信息。

获取设备收到的卫星信号个数

GnssStatus.Callback是用于接收GNSS事件发生时的通知的类,而registerGnssStatusCallback()方法用于将自定义的GnssStatus.Callback类注册到LocationManager类中。
首先自定义一个内部类继承自GnssStatus.Callback,并重写其中的onSatelliteStatusChanged()方法,具体代码如下:

@RequiresApi(api = Build.VERSION_CODES.N)
GnssStatus.Callback mGNSSCallback = new GnssStatus.Callback() {
    @Override
    public void onSatelliteStatusChanged(@NonNull GnssStatus status) {
        super.onSatelliteStatusChanged(status);
        // get satellite count
        satelliteCount = status.getSatelliteCount();
        mTvSatelliteCount.setText("共收到卫星信号:" + satelliteCount + "个");
    }
};

然后将mGNSSCallback注册到LocationManager中,具体代码如下:

mLocationManager.registerGnssStatusCallback(locaCallback);

通过上述步骤就能实现设备收到的卫星信号个数的统计。
注意,因为现在的GNSS系统包括GPS、GLONASS、BEIDOU等,Android官方提供的API也可以判断卫星所属的GNSS系统,通过调用status.getConstellationType(i)方法实现。以实现北斗卫星统计为例,可以在onSatelliteStatusChanged()方法里添加如下代码:

if(satelliteCount > 0) {
    for (int i = 0; i < satelliteCount; i++) {
        // get satellite type
        int type = status.getConstellationType(i);
        if(GnssStatus.CONSTELLATION_BEIDOU == type) {
            // increase if type == BEIDOU
            BDSatelliteCount++;
        }
    }
    Log.d(TAG, "BDS count:" + BDSatelliteCount);
}

获取用于定位的卫星信号个数

Android不一定将所有收到的卫星信号都用于定位算法中,会基于高度角、信噪比等剔除可信度不高的卫星信号。
Android官方提供封装方法status.usedInFix(i),该方法返回boolean值,可以直接用于判断该卫星信号是否用于定位,如增加判断语句:

if (status.usedInFix(i)) {
    BDSInFix++;
}

成果图

成果图

  • 15
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
《基于云原生卫星遥感大数据服务框架》是一篇关于利用云原生技术构建卫星遥感大数据服务的论文。该论文主要介绍了云原生技术如何应用于卫星遥感大数据服务框架的构建,以实现高效、灵活和可扩展的数据处理和分析。 云原生技术是一种IT基础设施建设和应用开发的方法论,旨在应对大规模、动态和分布式的应用场景。该论文提出了一个基于云原生技术的卫星遥感大数据服务框架,通过将传统的硬件和软件资源虚拟化,实现资源的弹性调度和高效利用。 在该框架中,卫星遥感数据被存储在云原生的对象存储系统中,以提供高可靠性和可扩展性。通过使用容器化技术,实现数据处理和分析的快速部署和运行。同时,通过运用弹性计算和自动化管理,实现对处理任务的动态调度和资源分配,使得数据处理过程更加高效和灵活。 另外,该框架还采用了开放的API接口,以支持用户对卫星遥感数据的访问和使用。同时,通过与其他相关平台和系统的集成,实现数据的共享和协同工作,提升整个卫星遥感大数据服务的效率和价值。 综上所述,《基于云原生卫星遥感大数据服务框架》着重介绍了如何利用云原生技术构建高效、灵活和可扩展的卫星遥感大数据服务框架。通过虚拟化、容器化和自动化等技术手段,对卫星遥感数据进行存储、处理和分析,以满足用户对大规模遥感数据的需求,同时提供高可靠性和可扩展性的服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保温杯拖把风扇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值