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

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

  1. php调用百度地图定位,php用百度地图API进行IP定位和GPS定位

    /** * 根据地理坐标获取国家.省份.城市,及周边数据类(利用百度Geocoding API实现) * 百度密钥获取方法:http://lbsyun.baidu.com/apiconsole/key ...

  2. Android定位开发之百度定位、高德定位、腾讯定位,三足鼎立一起为我所用!

    这几天的项目不是非常紧.于是想为未来可能要做的项目做一些技术储备. 下一个项目非常有可能是定位开发,须要用到手机定位功能,于是查了查如今比較流行的第三方定位,最火的基本上就是百度定位>高德定位& ...

  3. Android学习笔记:短信控制手机之“短信开启定位”

    2019独角兽企业重金招聘Python工程师标准>>> 首先,我必须说,我是菜鸟.接触Android不就久,在这里记下,第一想让自己有更加深刻的印象,第二也想和大家一起分享.如果出现 ...

  4. IP地址定位 API 接口

    IP地址定位 API 接口 根据 IP 地址进行定位查询. 1. 产品功能 提供精准.高效的 IP 地址定位查询: 返回的 IP 定位地址包含详细的位置信息: 全接口支持 HTTPS(TLS v1.0 ...

  5. 移动开发实验之百度地图定位app的开发

    一·百度地图API准备 1.下载百度地图的SDK,下载地址为:​​​​​​https://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk- ...

  6. android 高德地图移动卡顿_Xamarin.Forms Android使用高德地图SDK

    Xamarin.Forms Android 高德演示https://www.zhihu.com/video/1243224001301958656 介绍 本编文章分为2节,第1节是介绍高德地图SDK与 ...

  7. 实验十二 百度地图 定位

    一.实验目的 (1)学会配置百度地图开发环境 (2)能够定位到自己的所在位置 二.实验内容 利用百度地图资源开发自己的地图软件,实现定位自己所在位置的功能 三.实验结果图 四.实验代码 MainAct ...

  8. HTML网页获取当前定位经纬度/地理位置定位/百度定位/高德定位

    需求描述 在HTML页面获取当前定位经纬度 代码 优先使用地理位置定位,定位失败时取百度定位,否则使用高德IP定位: <!-- 引入百度地图API(需申请百度地图开发者账号,创建秘钥使用) -- ...

  9. 微信企业号开发:微信考勤百度地图定位,错误修正

    在使用百度地图进行微信考勤时,遇到很多问题,尤其是定位问题,我知道定位有偏差,但使用百度地图,几十次后,偶尔一次会错的离谱,例如直接就定位到了外省,例如我一直在西安,一次定位到了天津,一次定位到了石家 ...

最新文章

  1. 使用Druid数据源时候这个问题碰到过没:connection holder is null
  2. 从源码角度看Android系统SystemServer进程启动过程
  3. ibatisnet 学习手记(1)
  4. PHP(一)——概述及服务器配置
  5. JS学习记录(BOM部分)
  6. OpenSSL再曝CCS注入漏洞-心伤未愈又成筛子
  7. RUNOOB python练习题 14
  8. docker-ce安装
  9. Mysql执行计划2
  10. 软件测试的金字塔体系--从1个中心到5个要素
  11. 苹果Mac摄影照片降噪工具:ON1 NoNoise AI
  12. centos 安装LibreOffice word转PDF导出
  13. 三菱GXWorks2 程序写入CPU之前准备工作
  14. ubuntu 安装openproj-1.4-2.noarch.rpm
  15. linux 下的绘图软件Visio——流程图,矢量图
  16. C语言输出数组中最大最小值及位序
  17. 算法图解————K 近邻算法
  18. 数字信号处理前瞻(note1):奈奎斯特与折叠频率
  19. 邓仰东专栏|机器学习的那些事儿(四):基于GPU的机器学习实例之AlphaGO
  20. java解二次方程函数_Charting for Java Swing中的FunctionSeries

热门文章

  1. 微信小程序 实现地图
  2. 计算机黑屏不亮,计算机屏幕不亮,但主机已打开.
  3. 微信小程序「渲染层网络层错误」解决方法
  4. Springboot开发微信小游戏后台-玩家登录流程
  5. 计算机系统精品教程,_《计算机操作系统教程》课程教学课件(精品) 设备管理(88P).pdf...
  6. 进程同步之信号量机制(pv操作)
  7. App的打磨之路(中)
  8. 基于keras的双层LSTM网络和双向LSTM网络
  9. 面试官当面夸奖完我后,反手把我挂了...只能说这套路太..
  10. 解决】无法连接 MKS:套接字连接尝试次数太多正在放弃