关于Android中的位置服务解读
一提到位置或者定位,一般的开发者会第一时间百度地图和高德。这么做其实把自己仅仅当成了一个Api caller。还是细细了解一下系统的关于位置的架构比较好。下面开始细细品味。
不说第三方定位,系统原生带有位置提供者相关的API有三种:
提供者 | 描述 |
---|---|
NETWORK_PROVIDER | GMS或者手机制造商,原生手机不装GMS是为空的。装了GMS会出现“Google 位置信息服务”; |
GPS_PROVIDER | 手机GPS硬件,硬件有这个模块一般都支持,注意室内是获取不了的 |
PASSIVE_PROVIDER | 暂未了解 |
FUSED_PROVIDER | 隐藏了,被GMS私用 |
关于设置中位置三种选项分别为:
准确度高:使用 GPS、WLAN、移动网络和传感器来获取最准确的位置信息。使用 Google 位置信息服务更快速、更准确地确定您手机的大致位置。
耗电量低:使用耗电量较低的数据来源(如 WLAN 和移动网络)。使用 Google 位置信息服务更快速、更准确地确定您手机的大致位置。
仅限设备:仅使用 GPS(不使用 Google 位置信息服务)来提供位置信息。这种模式判断手机大致位置的速度可能比较慢,而且耗电量也可能较大。
再说一个GNSS,这个是一个新技术(像是支付行业中的聚合支付,将多种支付方式进行汇总,这里是将多国定位卫星,以前只是使用GPS,现在同时使用了,GPS北斗等等),但是应用开发者不需要关注,它已经被封装到了GPS_PROVIDER,应用程序开发不需要为"GNSS"进行特别的考虑。
Google 位置信息服务
为什么原生手机装了GMS,开发者就可以获取到NETWORK_PROVIDER的呢?就是这个「Google 位置信息服务」起得作用,具体是哪个包呢?
com.android.location.service.FusedLocationProvider
com.android.location.service.v3.NetworkLocationProvider
模拟定位ACCESS_MOCK_LOCATION
这个是Android提供了一个为了模拟位置
的接口,只在开发者选项
中提供,这个接口可以模拟所有的PROVIDER,直接向系统接口写入经纬度信息,系统就会将此信息返回给需要的App。
NETWORK_PROVIDER
网络定位都是谁提供的呢?国际上一个是Google提供,国内一般都是使用百度或者高德,OEM厂家需要将其内置到ROM中。
对于MIUI华为等
com.baidu.map.location
com.amap.android.location (最新)
com.xiaomi.metoknlp
com.qualcomm.location.nlp.NlpProxyService
com.amap.android.ams (过时,最高v1.9.2.16支持到8.1)
这方面资料很少,因为有这个需求的人很少。大厂ROM已经做了,小厂的CPU厂家也找了两大地图定位厂家合作了,如果你是一个个人玩家,就需要自己去找到这些网络定位提供者。
应用层定位SDK
最后再说一下应用层定位SDK,上面都是framwork
层的标准Api的位置系统,无论提供者是谁,App只要按照标准Api就可以取到位置。而国内App大多数会使用应用层的百度或者高德位置SDK,这个也在应用层级别提供了"NETWORK_PROVIDER",换句话说系统在不断的搜索周边的WiFi来定位,这些SDK也会不断的搜索。这也开启定位时非常耗电的一个原因。
其他资料
https://stackoverflow.com/questions/44601305/error-in-adding-location-service-to-android-custom-rom
com.android.location.fused
fused只是将NETWORK_PROVIDER和GPS进行了封装。
使用百度地址SDK为系统提供位置服务,apk名字命名为com.android.location.fused
https://www.cnblogs.com/zml-forever/p/5563189.html
https://github.com/microg/AppleWifiNlpBackend
frameworks/base/core/res/res/values/config.xml
https://www.jianshu.com/p/46f13b2da965
https://felixc.at/2016/09/fix-google-gms-network-location-on-your-android-rom/
https://www.jianshu.com/p/bfe2b3896445
https://www.cnblogs.com/zml-forever/p/5563189.html
https://github.com/RikkaApps/StorageRedirect-assets/issues/364
AutoNavi location services 1.8.0.12
https://www.apkmirror.com/apk/oneplus-ltd/autonavi-location-services/autonavi-location-services-1-8-0-12-release/autonavi-location-services-1-8-0-12-android-apk-download/
AutoNavi location services v1.9.2.16 APK
https://android-apk.org/com.amap.android.ams/30577606-autonavi+location+services-v1.9.2.16/lang/fa/
frameworks/base/core/java/android/app/ActivityManager.java
frameworks/base/core/java/android/app/ActivityManagerNative.java#3804