文章來源: http://blog.sina.com.cn/s/blog_70e5bf6e0102we34.html
感謝博主 末日的回響 ?提供的關于百度地圖在集成時所出現的Bug和解決方法,若此篇文章對您的權益有害,請聯系我刪除。謝謝
最近做一款平板導航工具,需要集成百度和高德地圖,包括基本功能如定位、搜索等,還包括集成導航實現在APP內導航而無需跳轉至其客戶端。因為了解百度,所以先集成的百度。
開發環境:win7,Android Studio2.1.2,JDK1.7,Android 4.4,5.1,6.0?
百度SDK使用心得:百度地圖目前最新版本是地圖4.0,導航3.1 ,在深入使用百度SDK后發現,其產品的更新迭代確實不如高德快,其技術支持也不如高德給力,而且百度地圖接入文檔有的竟顯示更新日期是1年前的了,另外,百度導航SDK所提供的數據不如高德導航SDK多?,百度基礎地圖SDK或者導航SDK單獨下載時開發包所支持的平臺是有多個的,而當組合下載時只有一個armeabi目錄,組合下載方式應該是兼容運行的,這會引起一個問題就是你的項目如果增加了不止armeabi這個目錄,估計會報錯,這問題解決方式再下文中會介紹。
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction?
百度集成問題:
1、發現so找不到或者編譯時文件沖突??,應檢查所下載的SDK是否單獨下載集成,需要哪些功能,應該在百度開放平臺上選擇組合下載方式,再集成,因為比如單獨下載百度基礎地圖SDK,然后再下載百度導航SDK然后再同時集成進去,可能會出現兩個SDK包的so文件或者jar包中有的資源沖突了,這個問題也常見,許多網友遇到了,解決方式應該是組合下載開發包再集成。
2、Native method not found: com.autonavi.amap.mapcore.MapCore.nativeNewIns?tance錯誤可能是項目支持的平臺不夠,增加armeabi、armeabi-v7a、x86、x86-64、arm64-v8a等平臺試試,如果不行,可嘗試下文兼容問題中第2種方式
3、?libBaiduMapSDK_base_v4_0_0.so" is 32-bit instead of 64-bit,這問題可見也是so文件放錯平臺目錄了,將32位so文件放入64位平臺如armeabi-v7a,x86-64目錄了。如果下載的開發包中有多個平臺目錄,那里面的so文件一定是不同的,一定要分別復制到項目相應的平臺目錄下,如果組合下載SDK開發包中只有armeabi目錄,那里面的so文件除非官方有說明否則都是可兼容運行的,百度目前也已支持64位機了,所以組合下載的so是可兼容運行的,但不要以為增加多個平臺目錄,然后將這同一個so都放入就可以,也有可能抱著錯誤,解決方式是按其demo只留一個armeabi目錄即可,如果項目中還有其他SDK需要建立其他平臺目錄,也最好不要放入,這種情況比較復雜,需實際去考慮,其中也可查看下文兼容問題中第2種方式。百度支持問答:http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=114745&page=1#pid238645
4、lopen("/data/data/youlain.smart.box/lib/libgnustl_shared.so", RTLD_LAZY) failed: dlopen failed: library "/data/data/youlain.smart.box/lib/libgnustl_shared.so" not found,這種問題類似上文第3點,找不到對應的so文件,可能缺少某個平臺的支持,解決方式就是建立其他平臺支持,如果是組合下載的SDK只有一個armeabi目錄則應該只保留這個目錄。百度支持問答:http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=114745&page=1#pid238667?
5?、建議搜索結果出現空坐標點的問題,百度建議搜索的結果列表,其中竟有的結果的坐標點是空的。。。看著解決了。
6、百度地圖在退出銷毀時可能遇到這個問題:android.app.IntentReceiverLeaked: MainActivity?has?leaked?IntentReceiver?com.baidu.navisdk.vi.VDeviceAPI$1@27d8b76e?that?was?originally?registered?here.?Are?you?missing?a?call?to?unregisterReceiver()???解決方法在退出時加入:VDeviceAPI.unsetNetworkChangedCallback();
7,在退出時也有可能遇到:MainActivity?has?leaked?IntentReceiver?com.baidu.navisdk.util.listener.PhoneStatusReceiver@11d4d01f?that?was?originally?registered?here.?Are?you?missing?a?call?to?unregisterReceiver()? ?解決方法在退出時加入:
?if(BaiduNaviManager.isNaviInited())BaiduNaviManager.getInstance().uninit();
?8、百度自家SDK不能做到協調,通過百度基礎地圖接口規劃處線路,在傳入導航時竟還需要經過算路,導航開始算路傳入參數是起點、終點和最多3個途經點,一共5個點,這樣規劃好的線路通過這5個點算路出的線路還能保證完全一樣?導航SDK不能直接傳入規劃線路作為參數開始導航,這是個缺陷,暫時未找到比較好的方式,只能重新算路之后再導航,而且算路之后就只有一條路,不可選擇。?
?高德SDK使用心得:高德地圖目前最新版是地圖3.3.2,導航1.9,高德地圖更新比百度快而且其導航SDK提供了比百度更多的信息,如路況查詢接口,剩余距離和時間查詢接口,比較方便。高德SDK單獨下載和組合下載區別同百度兩種下載方式區別一樣,其so文件都是兼容運行的,都只有armeabi目錄,多加或者放錯地方都有可能導致so文件找不到或者32位和64位機不對應,即使so可兼容運行在64位機子上。
高德集成問題:
1、高德SDK頻出空指針異常。我用fragment來顯示地圖的,但在多次打開地圖fragment又沒銷毀fragment的情況下,導航實例mAMapNavi= AMapNavi.getInstance(mContext);?也已經跟隨fragment生命周期初始化和銷毀了,但經常在fragment的onDestory()方法里調用mAMapNavi.stopNavi()時報空指針異常,原因是stopNavi中有句代碼調用this.api.stop();中的api是空的,isGpsReady()方法也是同樣問題,此時用的高德導航版本1.8,之后咨詢技術支持,估計高德也注意到了這個問題,幾天后就發布了導航1.9版本,查看其代碼,stopNavi()已經和上一版本完全不一樣了,所以我的地圖也穩定多了,這點給贊,比我咨詢百度基本2天才回復的態度好多了。高德技術問答:http://lbs.amap.com/dev/ticket#/tickets
2、?mAMapNavi= AMapNavi.getInstance(mContext);初始化失敗mAMapNavi為null的問題,原因是so找不到或者放錯地方,高德基礎地圖和導航SDK單獨下載和組合下載的區別同百度,所以這個解決方式和百度類似。
3、?不能截圖。高德基礎地圖提供了截圖接口,可以截圖,但使用其導航SDK時因為導航view是3D視圖,不存在view的緩存中所以不能通過獲取view的緩存圖來截圖,必須調用系統截圖功能,將整個屏保存下來,截圖代碼需要就自行百度了。
4、高德導航是單例模式,如果在規劃一次導航之后不調用停止導航再次啟動時可能還會保留有上次導航的緩存數據。
5、高德導航連續算路第3次之后一定失敗,失敗回調錯誤code一直報2,查資料2是網絡連接超時?。開始一直以為是連續算路并進入導航過程資源未釋放干凈,原來是算路時傳入的起點和終點列表一直用的同一對象并且為清空列表導致之后的算路傳入的起始點經緯度其實都按第一次算路的參數來,因為起點和終點都是一個列表傳入多個相隔太遠的經緯坐標就會導致多次之后計算失敗,但至于為啥報這個網絡錯誤,估計SDK的問題了
?
高德百度同時集成兼容問題:
1?、資源沖突問題,高德與百度jar包中有名字相同資源文件,這問題也有網友遇到過,因項目時間問題,目前我的解決方式也是簡單粗暴,因為偏好高德,而且估計百度也用不到沖突資源所涉及的功能,所以直接將百度jar包中的沖突圖片直接改名,這樣就可以編譯通過了,若以后尋到更好辦法,再來更新此文。
2、多方SDK支持的CPU架構沖突問題。除了高德百度,我的項目還用到了科大訊飛?,而科大訊飛需要支持如下平臺arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64,至于各個目錄對應什么平臺就不解釋了,我也解釋不清,百度好了,注意x86_64的確是下劃線,和armeabi-v7a不一樣,此時如果項目建這么多文件夾,而百度高德組合下載的SDK都是只有armeabi的,如果將這兩地圖的so都復制一份到所有平臺目錄,則會出上文百度第3個問題,如果地圖so文件只放armeabi目錄而其他目錄不放,則可能會報找不到so錯誤,這點困擾很久,最終解決方式是新建一個類庫library,將科大訊飛jar包和so文件都放入類庫中,他的so文件也在這個類庫中,然后自己項目引用這個類庫,自己項目只保留armeabi這個目錄,并且在build.gralde文件的defaultConfig中加入如下代碼:
ndk {
abiFilters"armeabi"http://輸出指定三種abi體系結構下的so庫,目前可有可無。
?}?
不然android studio 會從引用類庫中各個平臺目錄下去尋找對應的so文件,這個就會出現上文中一些錯誤,通過這種方式去解決暫時未發現會造成科大訊飛錯誤,也未再陸續出現上文中地圖那些so錯誤,原來只在華為4.4榮耀4C手機上能同時運營高德和百度,用5.0以上手機就會百度崩潰,高德崩潰,但現在通過這種方式都已經解決了,以后可能遇到的未知問題就兵來將擋水來土掩了。?