Android集成百度與高德SDK的體會和問題解決筆記

文章來源: http://blog.sina.com.cn/s/blog_70e5bf6e0102we34.html

感謝博主 末日的回響 ?提供的關(guān)于百度地圖在集成時(shí)所出現(xiàn)的Bug和解決方法,若此篇文章對您的權(quán)益有害,請聯(lián)系我刪除。謝謝

最近做一款平板導(dǎo)航工具,需要集成百度和高德地圖,包括基本功能如定位、搜索等,還包括集成導(dǎo)航實(shí)現(xiàn)在APP內(nèi)導(dǎo)航而無需跳轉(zhuǎn)至其客戶端。因?yàn)榱私獍俣?,所以先集成的百度?br>

開發(fā)環(huán)境:win7,Android Studio2.1.2,JDK1.7,Android 4.4,5.1,6.0?

百度SDK使用心得:百度地圖目前最新版本是地圖4.0,導(dǎo)航3.1 ,在深入使用百度SDK后發(fā)現(xiàn),其產(chǎn)品的更新迭代確實(shí)不如高德快,其技術(shù)支持也不如高德給力,而且百度地圖接入文檔有的竟顯示更新日期是1年前的了,另外,百度導(dǎo)航SDK所提供的數(shù)據(jù)不如高德導(dǎo)航SDK多?,百度基礎(chǔ)地圖SDK或者導(dǎo)航SDK單獨(dú)下載時(shí)開發(fā)包所支持的平臺是有多個(gè)的,而當(dāng)組合下載時(shí)只有一個(gè)armeabi目錄,組合下載方式應(yīng)該是兼容運(yùn)行的,這會引起一個(gè)問題就是你的項(xiàng)目如果增加了不止armeabi這個(gè)目錄,估計(jì)會報(bào)錯(cuò),這問題解決方式再下文中會介紹。

http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction?

百度集成問題:

1、發(fā)現(xiàn)so找不到或者編譯時(shí)文件沖突??,應(yīng)檢查所下載的SDK是否單獨(dú)下載集成,需要哪些功能,應(yīng)該在百度開放平臺上選擇組合下載方式,再集成,因?yàn)楸热鐔为?dú)下載百度基礎(chǔ)地圖SDK,然后再下載百度導(dǎo)航SDK然后再同時(shí)集成進(jìn)去,可能會出現(xiàn)兩個(gè)SDK包的so文件或者jar包中有的資源沖突了,這個(gè)問題也常見,許多網(wǎng)友遇到了,解決方式應(yīng)該是組合下載開發(fā)包再集成。

2、Native method not found: com.autonavi.amap.mapcore.MapCore.nativeNewIns?tance錯(cuò)誤可能是項(xiàng)目支持的平臺不夠,增加armeabi、armeabi-v7a、x86、x86-64、arm64-v8a等平臺試試,如果不行,可嘗試下文兼容問題中第2種方式

3、?libBaiduMapSDK_base_v4_0_0.so" is 32-bit instead of 64-bit,這問題可見也是so文件放錯(cuò)平臺目錄了,將32位so文件放入64位平臺如armeabi-v7a,x86-64目錄了。如果下載的開發(fā)包中有多個(gè)平臺目錄,那里面的so文件一定是不同的,一定要分別復(fù)制到項(xiàng)目相應(yīng)的平臺目錄下,如果組合下載SDK開發(fā)包中只有armeabi目錄,那里面的so文件除非官方有說明否則都是可兼容運(yùn)行的,百度目前也已支持64位機(jī)了,所以組合下載的so是可兼容運(yùn)行的,但不要以為增加多個(gè)平臺目錄,然后將這同一個(gè)so都放入就可以,也有可能抱著錯(cuò)誤,解決方式是按其demo只留一個(gè)armeabi目錄即可,如果項(xiàng)目中還有其他SDK需要建立其他平臺目錄,也最好不要放入,這種情況比較復(fù)雜,需實(shí)際去考慮,其中也可查看下文兼容問題中第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點(diǎn),找不到對應(yīng)的so文件,可能缺少某個(gè)平臺的支持,解決方式就是建立其他平臺支持,如果是組合下載的SDK只有一個(gè)armeabi目錄則應(yīng)該只保留這個(gè)目錄。百度支持問答:http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=114745&page=1#pid238667?

5?、建議搜索結(jié)果出現(xiàn)空坐標(biāo)點(diǎn)的問題,百度建議搜索的結(jié)果列表,其中竟有的結(jié)果的坐標(biāo)點(diǎn)是空的。。??粗鉀Q了。

6、百度地圖在退出銷毀時(shí)可能遇到這個(gè)問題: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()???解決方法在退出時(shí)加入:VDeviceAPI.unsetNetworkChangedCallback();

7,在退出時(shí)也有可能遇到:MainActivity?has?leaked?IntentReceiver?com.baidu.navisdk.util.listener.PhoneStatusReceiver@11d4d01f?that?was?originally?registered?here.?Are?you?missing?a?call?to?unregisterReceiver()? ?解決方法在退出時(shí)加入:

?if(BaiduNaviManager.isNaviInited())BaiduNaviManager.getInstance().uninit();

?8、百度自家SDK不能做到協(xié)調(diào),通過百度基礎(chǔ)地圖接口規(guī)劃處線路,在傳入導(dǎo)航時(shí)竟還需要經(jīng)過算路,導(dǎo)航開始算路傳入?yún)?shù)是起點(diǎn)、終點(diǎn)和最多3個(gè)途經(jīng)點(diǎn),一共5個(gè)點(diǎn),這樣規(guī)劃好的線路通過這5個(gè)點(diǎn)算路出的線路還能保證完全一樣?導(dǎo)航SDK不能直接傳入規(guī)劃線路作為參數(shù)開始導(dǎo)航,這是個(gè)缺陷,暫時(shí)未找到比較好的方式,只能重新算路之后再導(dǎo)航,而且算路之后就只有一條路,不可選擇。?

?高德SDK使用心得:高德地圖目前最新版是地圖3.3.2,導(dǎo)航1.9,高德地圖更新比百度快而且其導(dǎo)航SDK提供了比百度更多的信息,如路況查詢接口,剩余距離和時(shí)間查詢接口,比較方便。高德SDK單獨(dú)下載和組合下載區(qū)別同百度兩種下載方式區(qū)別一樣,其so文件都是兼容運(yùn)行的,都只有armeabi目錄,多加或者放錯(cuò)地方都有可能導(dǎo)致so文件找不到或者32位和64位機(jī)不對應(yīng),即使so可兼容運(yùn)行在64位機(jī)子上。

高德集成問題:

1、高德SDK頻出空指針異常。我用fragment來顯示地圖的,但在多次打開地圖fragment又沒銷毀fragment的情況下,導(dǎo)航實(shí)例mAMapNavi= AMapNavi.getInstance(mContext);?也已經(jīng)跟隨fragment生命周期初始化和銷毀了,但經(jīng)常在fragment的onDestory()方法里調(diào)用mAMapNavi.stopNavi()時(shí)報(bào)空指針異常,原因是stopNavi中有句代碼調(diào)用this.api.stop();中的api是空的,isGpsReady()方法也是同樣問題,此時(shí)用的高德導(dǎo)航版本1.8,之后咨詢技術(shù)支持,估計(jì)高德也注意到了這個(gè)問題,幾天后就發(fā)布了導(dǎo)航1.9版本,查看其代碼,stopNavi()已經(jīng)和上一版本完全不一樣了,所以我的地圖也穩(wěn)定多了,這點(diǎn)給贊,比我咨詢百度基本2天才回復(fù)的態(tài)度好多了。高德技術(shù)問答:http://lbs.amap.com/dev/ticket#/tickets

2、?mAMapNavi= AMapNavi.getInstance(mContext);初始化失敗mAMapNavi為null的問題,原因是so找不到或者放錯(cuò)地方,高德基礎(chǔ)地圖和導(dǎo)航SDK單獨(dú)下載和組合下載的區(qū)別同百度,所以這個(gè)解決方式和百度類似。

3、?不能截圖。高德基礎(chǔ)地圖提供了截圖接口,可以截圖,但使用其導(dǎo)航SDK時(shí)因?yàn)閷?dǎo)航view是3D視圖,不存在view的緩存中所以不能通過獲取view的緩存圖來截圖,必須調(diào)用系統(tǒng)截圖功能,將整個(gè)屏保存下來,截圖代碼需要就自行百度了。

4、高德導(dǎo)航是單例模式,如果在規(guī)劃一次導(dǎo)航之后不調(diào)用停止導(dǎo)航再次啟動(dòng)時(shí)可能還會保留有上次導(dǎo)航的緩存數(shù)據(jù)。

5、高德導(dǎo)航連續(xù)算路第3次之后一定失敗,失敗回調(diào)錯(cuò)誤code一直報(bào)2,查資料2是網(wǎng)絡(luò)連接超時(shí)?。開始一直以為是連續(xù)算路并進(jìn)入導(dǎo)航過程資源未釋放干凈,原來是算路時(shí)傳入的起點(diǎn)和終點(diǎn)列表一直用的同一對象并且為清空列表導(dǎo)致之后的算路傳入的起始點(diǎn)經(jīng)緯度其實(shí)都按第一次算路的參數(shù)來,因?yàn)槠瘘c(diǎn)和終點(diǎn)都是一個(gè)列表傳入多個(gè)相隔太遠(yuǎn)的經(jīng)緯坐標(biāo)就會導(dǎo)致多次之后計(jì)算失敗,但至于為啥報(bào)這個(gè)網(wǎng)絡(luò)錯(cuò)誤,估計(jì)SDK的問題了

?

高德百度同時(shí)集成兼容問題:

1?、資源沖突問題,高德與百度jar包中有名字相同資源文件,這問題也有網(wǎng)友遇到過,因項(xiàng)目時(shí)間問題,目前我的解決方式也是簡單粗暴,因?yàn)槠酶叩?,而且估?jì)百度也用不到?jīng)_突資源所涉及的功能,所以直接將百度jar包中的沖突圖片直接改名,這樣就可以編譯通過了,若以后尋到更好辦法,再來更新此文。

2、多方SDK支持的CPU架構(gòu)沖突問題。除了高德百度,我的項(xiàng)目還用到了科大訊飛?,而科大訊飛需要支持如下平臺arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64,至于各個(gè)目錄對應(yīng)什么平臺就不解釋了,我也解釋不清,百度好了,注意x86_64的確是下劃線,和armeabi-v7a不一樣,此時(shí)如果項(xiàng)目建這么多文件夾,而百度高德組合下載的SDK都是只有armeabi的,如果將這兩地圖的so都復(fù)制一份到所有平臺目錄,則會出上文百度第3個(gè)問題,如果地圖so文件只放armeabi目錄而其他目錄不放,則可能會報(bào)找不到so錯(cuò)誤,這點(diǎn)困擾很久,最終解決方式是新建一個(gè)類庫library,將科大訊飛jar包和so文件都放入類庫中,他的so文件也在這個(gè)類庫中,然后自己項(xiàng)目引用這個(gè)類庫,自己項(xiàng)目只保留armeabi這個(gè)目錄,并且在build.gralde文件的defaultConfig中加入如下代碼:

ndk {

abiFilters"armeabi"http://輸出指定三種abi體系結(jié)構(gòu)下的so庫,目前可有可無。

?}?

不然android studio 會從引用類庫中各個(gè)平臺目錄下去尋找對應(yīng)的so文件,這個(gè)就會出現(xiàn)上文中一些錯(cuò)誤,通過這種方式去解決暫時(shí)未發(fā)現(xiàn)會造成科大訊飛錯(cuò)誤,也未再陸續(xù)出現(xiàn)上文中地圖那些so錯(cuò)誤,原來只在華為4.4榮耀4C手機(jī)上能同時(shí)運(yùn)營高德和百度,用5.0以上手機(jī)就會百度崩潰,高德崩潰,但現(xiàn)在通過這種方式都已經(jīng)解決了,以后可能遇到的未知問題就兵來將擋水來土掩了。?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容