Android 添加高德或百度网络定位服务
Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状态,因此对于第三方OEM厂商经常需要与高德或百度合作,使用这两个服务提供商提供的网络位置定位服务。现将在Android平台集成第三方网络定位服务的步骤简述如下:
1、向高德或百度获取网络定位服务apk,并集成至system/app目录下,有时需要同步获取其运行时需要的库,并集成与指定目录,一般是system/lib目录下,目前其包名为:
高德:com.amap.android.location
百度:com.baidu.map.location
2、配置Config.xml文件(frameworks/base/core/res/res/values)
<bool name="config_enableNetworkLocationOverlay" translatable="false">true</bool> <string name="config_networkLocationProviderPackageName" translatable="false">@null</string> <bool name="config_enableFusedLocationOverlay" translatable="false">true</bool> <string name="config_fusedLocationProviderPackageName" translatable="false">com.android.location.fused</string> <bool name="config_enableHardwareFlpOverlay" translatable="false">true</bool> <string name="config_hardwareFlpPackageName" translatable="false">com.android.location.fused</string> <bool name="config_enableGeocoderOverlay" translatable="false">true</bool>
<string name="config_geocoderProviderPackageName" translatable="false">@null</string>
从配置文件中可以看到这里有4个开关,分别对应于NLP、Fused、Flp、Geocoder服务,这里以NLP和Gecoder服务为例。
若config_enableNetworkLocationOverlay的值设为false,则使用config_networkLocationProviderPackageName
若config_enableNetworkLocationOverlay的值为true,则使用
<string-array name="config_locationProviderPackageNames" translatable="false"> <!-- The standard AOSP fused location provider --> <item>com.android.location.fused</item> </string-array>
例如定制百度定位,则需要配置如下:
<string-array name="config_locationProviderPackageNames_baidu" translatable="false"> <!-- The Baidu Network Location Provider --> <item> com.baidu.map.location</item> <!-- The standard AOSP fused location provider --> <item>com.android.location.fused</item> </string-array>
3、网络服务binder的逻辑在LocationManagerService.java中loadProviderLocked方法中
注意事项1:一般厂商都会添加兼容设置,(1)比如会同时添加高德、百度、Google定位服务,能找到那个服务则binder对应服务,这时候可能需要做包名验证,因为Android原生只做签名验证,若此时OEM对高德、百度服务重新签名则无法做到识别binder,会造成重复binder同一个服务现象。(2)添加国内、国外自动切换的功能,此时需要结合通信提供的接口,实现国内外的判断。
注意事项2:成功binder到服务后,则会添加对该服务的监控,包的卸载,加载、安装都会引起rebinder动作