前言
本文不會過度介紹百度地圖SDK的Api使用发框,更多地介紹遇到的一些問題與注意事項菇怀。
一餐胀、百度地圖SDK相關資源
第一步必然是注冊登錄賬號(只要有百度賬號就OK)棚蓄,獲取百度地圖SDK及文檔靶累,地址如下:
[百度地圖開放平臺][1],文檔及SDK資源都在這里啦癣疟。
[1]: http://lbsyun.baidu.com/
下載頁面如下:
建議按照所需功能下載相應的SDK挣柬,以免出現(xiàn)缺包及沖突的現(xiàn)象發(fā)生。
二睛挚、創(chuàng)建應用
這一步很關鍵邪蛔,因為涉及到獲取Appkey和設置密鑰。如果沒有配置好應用扎狱,地圖是無法成功加載的侧到。
1.進入官網-控制臺-點擊“創(chuàng)建應用”
頁面如下:
接著填寫應用名稱,選擇應用類型淤击,然后選擇啟用服務(默認全選匠抗,如果不確定的話,就全選吧)污抬。
2.配置包名及SHA1值
當我們選擇應用類型為Android SDK汞贸,會出現(xiàn)如下頁面:
我們發(fā)現(xiàn)需要填寫發(fā)布版SHA1,開發(fā)版SHA1及包名印机,包名好解決(就是我們app的包名矢腻,從項目的清單文件里就能找到),但是這兩個SHA1 是什么呢射赛?點擊“查看詳細配置方法”多柑,我們一探究竟。
打開頁面之后你會發(fā)現(xiàn)楣责,百度關于如何獲取SHA1已經介紹的很清楚了竣灌。主要采取第一種方法,通過命令行秆麸,使用keytool獲取 ** 初嘹,定位到.adnroid目錄,輸入
keytool -list -v -keystore debug.keystore
蛔屹,這時需要輸入密鑰口令(密鑰口令默認是android)削樊,會得到三種指紋證書,選取SHA1類型的證書,復制填入到開發(fā)版的SHA1漫贞。獲取開發(fā)版的方法與其類似甸箱,只需要定位到項目的簽名文件目錄,在命令行輸入
keytool -list -v -keystore 簽名文件名
輸入創(chuàng)建簽名文件時設置的密鑰口令迅脐,就能獲取到此簽名的SHA1芍殖,然后填入發(fā)布版SHA1即可,得到SHA1界面如下:點擊提交之后谴蔑,我們就可看到控制臺里就有我們剛剛創(chuàng)建的應用(這時就能看到appkey豌骏,簡稱AK),注意AK**值隐锭,之后將會用到窃躲。
三、百度地圖SDK
當我們完成以上配置之后钦睡,接下來就進入到喜聞樂見的導包環(huán)節(jié)蒂窒。這個環(huán)節(jié)基本無坑,只有幾點需要注意荞怒。
1.關于so文件與BaiduLBS_Android.jar
第一步獲取資源時洒琢,我們根據選擇所需功能獲得了百度地圖SDK的so文件與jar包,需要注意BaiduLBS_Android.jar這個jar包會包含你選擇的功能所有代碼(比如你選擇了導航褐桌,那么導航的代碼也包含在這里)衰抑,不需要像demo(有的版本的Demo是會分包的)中那樣集成,避免出現(xiàn)沖突荧嵌。
加入so文件的時候注意呛踊,應該與你項目中的支持so庫類型一致,比如項目中只有armeabi與armeabi-v7a文件夾完丽,那么就將百度地圖SDK對應的so加入恋技,不需要添加其他類型(如x86等)。如果需要適配所有CPU架構的機器逻族,不得已群全部導入的情況下,就要檢查項目中已使用的其他SDK的so是否支持所有的平臺骄崩,適當地做出取舍聘鳞。簡而言之,各種CPU架構下的文件夾的so應該保持對應一致(不要在armeabi有a.so要拂,而x86下卻沒有抠璃,這種情況我們只保留armeabi就可以了)。這一點在我們使用其他第三方SDK時脱惰,也是適用的搏嗡。
2.項目配置
導入相關文件之后,需要在項目中做出相應配置,就能正常使用百度地圖SDK了采盒。這里注意幾點:
1旧乞、 在application中添加開發(fā)密鑰
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="開發(fā)者 key" />
</application>
這個值在創(chuàng)建應用之后就能獲得,千萬不能出現(xiàn)錯誤磅氨。
2尺栖、Android Studio默認放so文件的目錄是src\main\jniLibs目錄,這個目錄需要自己建烦租,如果沒有建立也可以放在libs中延赌,只不過需要在app.gradle做如下配置:
sourceSets{
main{
jniLibs.srcDir 'libs'
//說明so的路徑為該libs路徑,關聯(lián)所有地圖SDK的so文件
}
}
3叉橱、提前配置混淆文件(怕后面忘記)挫以,混淆方法如下:
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-dontwarn com.baidu.**
3.正式使用中的問題
使用SDK地圖時,只要按照文檔中編寫窃祝,基本問題都可以解決掐松。這里記錄以下使用中遇到的問題,不定期更新锌杀。
1.如何刪除指定的單一或者幾個Marker
按照文檔所述个绍,我們可以輕松地在地圖中添加Marker纹份,但是當我想要刪除某個Marker時,翻閱文檔只找到這個方法
mBaiduMap.clear();
//清除地圖上所有覆蓋物,無法分成批刪除
真的無法成批刪除嗎加矛?當我查看添加Marker代碼時,有了新的發(fā)現(xiàn)欠啤。添加Marker方法如下:
//定義Maker坐標點
LatLng point = new LatLng(39.963175, 116.400244);
//構建Marker圖標
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka);
//構建MarkerOption哗咆,用于在地圖上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
//在地圖上添加Marker,并顯示
mBaiduMap.addOverlay(option);
我發(fā)現(xiàn)mBaiduMap.addOverlay(option)
這個方法會返回一個Overlay的對象猾担,而且Overlay類中有一個remove()方法袭灯,那么我們就可以實現(xiàn)刪除指定marker的功能了,代碼如下:
//在地圖上添加Marker绑嘹,并顯示稽荧,得到返回的overlay對象
Overlay overlay = mBaiduMap.addOverlay(ooA);
//當需要刪除這個marker時
overlay.remove();
四、百度定位SDK
1.項目配置
基本按照文檔上走不會有問題工腋,只需要注意不要漏掉
<service
android:name="com.baidu.location.f"
android:enabled="true" android:process=":remote">
</service>
這個服務以及相關權限姨丈。
2.正式使用中的問題
1.Android6.0的動態(tài)權限申請
百度定位SDK需要的權限中,有部分在Android6.0以上的系統(tǒng)中需要動態(tài)申請:
在Android 6.0系統(tǒng)中擅腰,需要動態(tài)獲取的權限涉及到:
1. 獲取手機狀態(tài):
Manifest.permission.READ_PHONE_STATE;
2. 獲取位置信息:
Manifest.permission.ACCESS_COARSE_LOCATION;
Manifest.permission.ACCESS_FINE_LOCATION;
3. 讀寫SD卡:
Manifest.permission.READ_EXTERNAL_STORAGE;
Manifest.permission.WRITE_EXTERNAL_STORAGE;
因此我們應該在申請到這些權限之后在做相關的處理蟋恬。
2.BDLocation.getAddrStr()有時返回null
百度定位SDK,BDLocationListener的onReceiveLocation(BDLocation location)這個回調函數會將定位的相關信息放在BDLocation location中趁冈。但是使用過程中發(fā)現(xiàn)歼争,調用location.getAddrStr()獲取定位點地址時拜马,返回為null,但是定位地點的經緯度是有的沐绒。同事教我使用經緯度獲取地址(但是會有一定誤差俩莽,勉強能用),方法如下:
//定位點
BDLocation lastLocation洒沦;
GeoCoder geoCoder = GeoCoder.newInstance();
//
final OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
// 反地理編碼查詢結果回調函數
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null
|| result.error != com.baidu.mapapi.search.core.SearchResult.ERRORNO.NO_ERROR) {
// 沒有檢測到結果
return;
}
List<PoiInfo> poiInfos = result.getPoiList();
if (poiInfos != null && poiInfos.size() > 0){
//通常取第一條即可
PoiInfo info = poiInfos.get(0);
TLog.error("Address", info.address);
}else {
//沒檢索到結果
}
}
// 地理編碼查詢結果回調函數
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null
|| result.error != com.baidu.mapapi.search.core.SearchResult.ERRORNO.NO_ERROR) {
// 沒有檢測到結果
}
}
};
// 設置地理編碼檢索監(jiān)聽者
geoCoder.setOnGetGeoCodeResultListener(listener);
//
geoCoder.reverseGeoCode(new ReverseGeoCodeOption()
.location(new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude())));
這是獲取定位點地址的下策豹绪,一般來說回調函數onReceiveLocation(BDLocation location)中的location還是能正常取到值的。
五申眼、百度導航SDK
1.項目配置
1.只有armeabi的so
特別注意瞒津,百度導航SDK只提供了armeabi的so文件,而且里面還包括了百度語音功能所需的so括尸。
2.百度語音配置
因為百度導航包含了語音功能巷蚪,所以要在百度語音中創(chuàng)建應用(我測試時發(fā)現(xiàn)現(xiàn)在會默認在百度語音控制臺創(chuàng)建,不過沒有自動創(chuàng)建的話濒翻,手動創(chuàng)建也不是什么難事)屁柏,之后再代碼中設置百度語音的APPID(這個值在百度語音的控制臺中查看):
Bundle bundle = new Bundle();
// 必須設置APPID,否則會靜音 bundle.putString(BNCommonSettingParam.TTS_APP_ID, "9354030");
BNaviSettingManager.setNaviSdkParam(bundle);
2.正式使用的問題
1.缺少assets資源文件導致黑屏
這是使用百度導航SDK常見坑有送,有時經常忘記把下載的assets資源文件導入項目中淌喻,看似它們是png圖片,實際上它們是做了偽裝的資源文件雀摘,一定得導入裸删,不然導航頁面黑屏。
就是它們阵赠,多少開發(fā)者落在它們手中涯塔。
2.Android6.0的動態(tài)權限申請
老生常談的問題了,如果沒解決好清蚀,也可能導致導航頁面黑屏匕荸。主要需要以下權限:
Manifest.permission.READ_PHONE_STATE;
Manifest.permission.ACCESS_FINE_LOCATION;
Manifest.permission.WRITE_EXTERNAL_STORAGE;
筆者曾經因為少了讀寫文件權限導致導航頁面黑屏,排查了一天bug枷邪。
3.算路失敗
key配置正確榛搔,百度導航引擎初始化成功,但是調用導航卻算路失敗东揣。
導航時算路失敗的原因有以下幾種:
(1)地理位置獲取失敗
(2)傳入的經緯度有誤(例如經緯度弄反药薯,經緯度標注的點在國外)
(3)定位服務未開啟
(4)傳入的節(jié)點距離太近
(5)節(jié)點輸入有誤(例如設置了某個節(jié)點為空)
(6)上次算路取消了,需要等一會才能進行下一次算路
4.在部分8.0機型上救斑,導航頁面右下角小圖變形問題
這個問題是當我將手機系統(tǒng)升級到8.0時發(fā)現(xiàn)的,具體情況如下圖:
我一時找不出原因真屯,只能再看百度的Demo有沒有問題脸候,用手機一運行Demo
,果不其然,同樣的問題出現(xiàn)了。沒辦法运沦,只能求助百度了泵额,好在最近百度地圖SDK上線了一個問題反饋的功能,之后得到官方的的回答携添,解決辦法是:替換assets里面兩個資源文件(以前我用的是3.3.1版本嫁盲,現(xiàn)在換成3.3.3)
沒錯,還是這兩個家伙:
結語
本文主要總結最經使用百度地圖相關SDK遇到的一些問題烈掠,不定期更新羞秤。