您现在的位置是:首页 >技术杂谈 >Android有官方的GPS定位API,为什么还要使用百度/高德定位SDK ?网站首页技术杂谈

Android有官方的GPS定位API,为什么还要使用百度/高德定位SDK ?

氦客 2023-05-17 20:00:02
简介Android有官方的GPS定位API,为什么还要使用百度/高德定位SDK ?

1. 背景

小组在一个Demo项目中,图省事准备使用官方的GPS定位API
但在我的印象中,官方的定位API是不好用的,一般都是用 高德地图/百度地图 的定位SDK的。
使用官方的定位API获取定位的话,在办公室调试的时候,可能室内压根获取不到的。
但是试了一下后让我感到惊讶,居然在室内都能定位到,这是怎么回事 ? 和我印象中的不一样啊
所以,对此查阅了若干资料,终于是搞明白了

通过本文,会讲清楚这几个问题

  • 有哪几种主动定位的方式 ?
  • 为什么在室内GPS定位几乎收不到信号 ?
  • 为什么在室内还能进行定位呢 ?
  • 是该使用官方定位API还是百度/高德定位SDK呢 ?

2. Android官方定位API

先来看下Android官方定位API,有这几种定位方式

  • GPS_PROVIDER:通过 GPS 来获取地理位置的经纬度信息
  • NETWORK_PROVIDER : 通过移动网络的基站或者 Wi-Fi 来获取地理位置
  • PASSIVE_PROVIDER : 被动定位,其他应用比如百度、高德等使用了定位,系统会更新定位信息并保存下来,通过此方式可以获取最近一次的位置信息。可以查询 getProvider() 方法决定位置更新的由来,需要 ACCESS_FINE_LOCATION 权限,但是如果未启用 GPS,则此 provider 可能只返回粗略位置匹配;

3. 查阅网上文章的说法

搜了下网上文章上的描述,也和我印象中的观点是类似的
官方点的高位API中主动定位有两种方式,但不太好用

  • GPS定位 : 在室内开发时,手机根本几乎没法获取到位置信息的
  • 网络定位 : 由于大陆的网络问题,没法访问google的服务

在这里插入图片描述

类似观点的文章还有
解决Android原生定位的坑
功耗大?定位精度差?如何优化Android原生定位
Android原生定位服务LocationManager
android手机定位onLocationChanged长时间不返回

4. 为什么GPS在室内会收不到信号 ?

查阅了相关资料,可以得出,由于太空卫星离地面太远,所以天线对天空之间不能有遮挡物。
现在的房子都是由钢筋混泥土建造而成的,所以GPS信号会被阻隔或反射而接收不到了。

在这里插入图片描述
在这里插入图片描述

5. 为什么在室内还能进行定位呢 ?

我又看了下我在Github上找的定位Demo的源码,发现平板上能获取到定位是因为我找的那个定位Demo内部做了优化 : 如果GPS获取不到,那就通过网络获取定位。
应该是国内高版本的Android做了优化,没有使用Google的网络 (国内访问不了google),而国内高版本手机系统网络定位是针对国内网络环境专门做过优化的,所以可以获取到定位。
不过这种方式获取的定位是大致位置,精确度不高的。
如果单纯获取GPS定位,我试了下,室内几乎是获取不到的,把手机放到窗外才能获取到GPS定位。

如果 Android 版本过低,或者使用原生Android系统的手机,可能在国内,也无法进行室内定位 (由于缺少设备,未验证该结论)

6. 百度/高德定位SDK会更靠谱吗 ?

6.1 高德地图定位SDK介绍

百度/高德这种专门的定位SDK都是融合多种定位数据(GPS、基站、Wifi、蓝牙等),得到的定位信息会比Android原生的定位更靠谱,而且是免费的。

这里以高德定位SDK为例,截取了部分官方对它的介绍

在这里插入图片描述
在这里插入图片描述

6.2 各种手机定位方式的原理

手机定位方式主要包括:GPS定位和网络定位 (基站、WiFi、蓝牙等)

6.2.1 GPS定位

通过GPS接收机接收卫星广播,通过解析多个可见卫星的位置、距离等信息以及相应算法得出自己的位置信息。
优点 :

  • 定位精度高,GPS定位分为军用和民用,民用领域的精度基本可在10米以内
  • 使用GPS定位,无需SIM卡、无需网络

缺点 :

  • 定位慢(相比网络定位来说定位要慢)
  • 耗电多(相比网络定位来说更耗电)
  • 室内或者地下室无法定位(因为卫星信号穿透能力弱,所以室内无法定位,即使室外,云层厚的地方,定位受影响)
  • 绝大部分手机终端用户默认不开启GPS功能

6.2.2 网络定位

网络定位是将手机设备收到的信号(主要是基站、Wifi、蓝牙)发送到网络服务器,获得位置。之所以要将信号数据发送到网络上,是因为网络定位是利用信号指纹进行定位,需要一个庞大的且持续更新的指纹数据库,这个数据库难以同步到移动设备上。为了进行定位,需要事先建立每个位置的指纹特征,然后在定位时用实时指纹比对每个位置的历史指纹,确定位置。

高德和百度等定位SDK都有维护一套庞大的指纹数据库,且使用的是国内网络,所以在国内就可以很好的使用网络定位了。

6.1.2.1 基站定位

根据手机终端和多个基站位置、信号强弱等关系,计算自己的位置信息。

优点:

  • 定位速度快
  • 耗电少
  • 室内可用

缺点:

  • 定位误差大,定位精度在几十米到几千米,精度依赖于基站的分布及覆盖范围的大小,通常精度在150米
  • 在城市中基站覆盖率比较高,推荐使用基站定位,如果是在郊区,基站相距较远,基站的覆盖没有城里好,定位的误差比较大
6.2.2.2 WiFi / 蓝牙定位

利用手机搜索的无线热点信号和信号强度,匹配热点位置服务器数据,返回手机位置信息。

蓝牙也是类似的。

原理 :

  1. 每一个无线热点都有唯一一个BSSID(即mac地址),无线热点的位置一定时间内相对来讲是固定的
  2. 手机开启WiFi时,可以搜索到附近无线热点及热点信号强度
  3. 手机将搜索到的无线热点列表信息上传到位置服务器;位置服务器通过计算,就可以返回手机定位信息

优点:

  • 定位精度高,特别在无线网络热点较多的地方;
  • 定位速度快;

缺点:

  • 依赖WiFi信号;

6.2 部分参考
高德网络定位算法的演进
手机定位方式总结
android中几种定位方式详解

7. 小结

通过本文,我们可以回答本文开头的问题了

  • 有哪几种主动定位的方式 ?
    • 有GPS定位和网络定位两种
  • 为什么在室内GPS定位几乎收不到信号 ?
    • 因为太空卫星离地面太远,所以天线对天空之间一旦有遮挡物,GPS定位信号就被被干扰了
  • 为什么在室内还能进行定位呢 ?
    • 因为老版本的国内Android系统,对于网络定位未做优化,用的Google的网络,国内自然访问不了
    • 高版本的国内Android手机系统,已经正对国内的网络环境,做了优化,所以就可以使用网络定位了
  • 是该使用官方定位API还是百度/高德定位SDK呢 ?
    • 百度/高德等专业的定位SDK会更靠谱,生产项目建议使用专业的定位SDK进行开发
    • 如果是Demo项目,只在几个新的手机上安装,为了方便,可以使用Android官方的原生定位,同样可以定位成功,可以看这个定位Demo

本文为氦客在CSDN上独家发布
地址 : https://blog.csdn.net/EthanCo/article/details/129882487

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。