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動作
