目录

  • 概述
  • 权限申请及开启GPS
  • 调用原生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 openif (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {Toast.makeText(getApplicationContext(), "请开启GPS导航...", Toast.LENGTH_SHORT).show();// trun to the GPS setting pageIntent 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 changedpublic void onLocationChanged(@NonNull Location location) {mTvLatitude.setText("纬度:" + location.getLatitude());mTvLongitude.setText("经度:" + location.getLongitude());// change the flag, to record cur statusLog.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() {@Overridepublic void onSatelliteStatusChanged(@NonNull GnssStatus status) {super.onSatelliteStatusChanged(status);// get satellite countsatelliteCount = 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 typeint type = status.getConstellationType(i);if(GnssStatus.CONSTELLATION_BEIDOU == type) {// increase if type == BEIDOUBDSatelliteCount++;}}Log.d(TAG, "BDS count:" + BDSatelliteCount);
}

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

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

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

成果图

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

  1. Android 打开 GPS 导航并获取位置信息

    原文地址为: Android 打开 GPS 导航并获取位置信息 最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: getL ...

  2. 小程序通过API获取位置信息 微信API 百度地图API

    博客简介 本篇博客介绍如何调用微信API获取经纬度,如何调用百度地图API获取实物位置 微信API获取经纬度信息 百度地图API获取实物位置 微信小程序获取经纬度 微信提供了获取当前设备经纬度的API ...

  3. Android GPS应用:动态获取位置信息

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 在上文中,介绍了GPS概念及Android开发GPS应用涉及到的常用类和方法.在本文中,开发一个小应用,实时获 ...

  4. uni-app开发微信小程序获取位置信息并且计算距离

    一.uniapp项目 打开uniapp项目的配置文件manifest.json,选择"源码视图". /* 小程序特有相关 */ "mp-weixin": {&q ...

  5. 微信小程序使用高德API获取位置信息

    //调用方法app.getAmapLocation().then((res) => {console.log(res);}); var amapFile = require('static/js ...

  6. 对Android GPS获取位置信息的新研究.

    前段时间略看了Android 的GPS API,就冒然发布了一片博文,现在再回过头来看看,确实有不少不足甚至错误.这篇算做补充和纠正吧. 1.要想获取位置信息,需要在手机设置中将"位置与安全 ...

  7. Android位置服务介绍,并介绍如何通过LocationManager对象获取位置信息

     1.位置服务,英文翻译为Location-Based Services,简称LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综合应用服务, ...

  8. android 获取当前坐标,Android获取位置信息的方法

    本文实例为大家分享了Android获取位置信息的具体代码,供大家参考,具体内容如下 1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务 ...

  9. Android 使用LocationLstenser获取位置信息

    第一步: 注册一个LocationLstenser: this.locationManager=(LocationManager)this.getSystemService(Context.LOCAT ...

最新文章

  1. wxWidgets:wxSpinEvent类用法
  2. 支付二维码php能实现吗_(实用篇)微信支付扫码支付php版
  3. oracle rac常用的网络检查命令
  4. 如何把springboot项目部署到tomcat上
  5. java cookie包_Java cookie的使用
  6. mysqladvisor安装
  7. vs2010+Silverlight4+wcf开发部署全过程
  8. Python Flask接口开发
  9. 十大OpenGL教程
  10. 游戏版署过审注意事项
  11. 二层交换机与三层交换机交换原理
  12. 在浏览器输入URL,按下回车之后的流程?
  13. 人工智能从概念到实战
  14. canvas小虫子(利用canvas形成多个形状类似虫子的线条)
  15. SQL语言基础及数据定义功能
  16. Android 11.0 12.0系统默认授予读写权限给第三方app
  17. In a case you entered incorrect password, please update it in Keychain Acces
  18. 浅析技能音效制作思路
  19. 结构方程模型amos软件一些常见的处理问题
  20. matlab simulink响应谱计算

热门文章

  1. txt文件编码批量转换器V2.11版
  2. 驭势科技吴甘沙:乘用车智能驾驶淘汰赛的七个核心观点
  3. mysql唯一索引冲突的解决方案
  4. discuz迁移到虚拟空间后无法上传图片的问题
  5. SpringBoot + Mybatis实现关键字模糊查询
  6. 计算机应用基础pdf清华大学,清华大学计算机应用基础WIN7+OFFICE2010-.ppt
  7. 网上收集的各网摘地址 备用
  8. nnformer中的V-MSA/SV-MSA
  9. Labview之子面板的使用
  10. 马云入股恒大背后暗藏四大隐情?