近期的一個(gè)phonegap項(xiàng)目把我做的焦頭爛額,最讓人蛋疼的就是安卓4.1.x對(duì)html5的定位獲取經(jīng)緯度有個(gè)無比巨大的坑,一般我們利用如下代碼進(jìn)行html5的定位
navigator.geolocation.getCurrentPosition(function(pos){
alert(JSON.stringify(pos))
},function(err){
alert(JSON.stringify(err))
}, {
enableHighAccuracy: false,
timeout: 60*1000,
maximumAge: 1000*60*10
});
上述代碼在ios上一切正常,在安卓4.3及以后的機(jī)器也可以正常訪問,但是在安卓4.1上就會(huì)出現(xiàn)timeout,如果我們把 enableHighAccuracy 設(shè)置為 true,那么在室外,空氣良好的地方,安卓4.1將能夠通過衛(wèi)星進(jìn)行定位,但是速度巨慢,其實(shí)我們很多時(shí)候并不是想要非常精準(zhǔn)的定位信息,完全可以通過基站或者wifi來定位,雖然html5提供給了我們這樣的接口,但是安卓4.1上支持的不是很好。
另外一個(gè)巨坑也直接影響了我對(duì)這個(gè)問題的判斷,如果我重啟了安卓4.1的機(jī)器,那么上述代碼將能夠正常跑大約幾小時(shí),甚至半天,可是到了第二天又會(huì)出現(xiàn)同樣的問題,無盡的timeout??偛荒茏尶蛻裘看问褂枚ㄎ还δ芏贾貑⒁淮螜C(jī)器吧,涉及這個(gè)問題的機(jī)器有包括我的華為,三星note2,oppo等目前主流的安卓4.1系統(tǒng)的機(jī)子,在另外幾臺(tái)例如glasky3、紅米等安卓4.3的機(jī)器上沒有出現(xiàn)。
然后我直接將上述代碼在瀏覽器中運(yùn)行,發(fā)現(xiàn)安卓4.1也是無法跑起來,天真的我以為是安卓4.1對(duì)html5的接口支持問題,于是利用cordova加載geolocation插件,想利用cordova的native方法解決這個(gè)問題,但是問題依舊,其中意外的發(fā)現(xiàn)我的華為和note2能夠跑起來了,其實(shí)只不過碰巧剛重啟過而已。
這個(gè)是我在stackoverflow上發(fā)的問題,碰到這類問題的中外友人巨多。
如何填補(bǔ)這個(gè)坑呢?我搜遍了整個(gè)網(wǎng)絡(luò),發(fā)現(xiàn)國外可以使用google地圖來解決,而國內(nèi)只有使用百度的定位SDK來解決了,不過最新的安卓百度定位SDK4.1同樣巨坑無比,直接下載官方的demo跑在真機(jī)上各種無法定位,一直報(bào)errorcode 602,于是逛了下百度SDK的論壇,發(fā)現(xiàn)很多人說4.1版本的SDK問題很多,不如用回4.0版本,于是我報(bào)著試試看的心情用回了SDK4.0版本,最終在安卓4.1的機(jī)器上定位成功,不存在需要重啟的情況,然后我根據(jù) andybuit 作者的代碼,小幅改動(dòng),封裝成支持新版 cordova 3.4.1 的插件放在github上,供碰到同樣問題的朋友使用,希望能夠幫助到他們。再次感謝 andybuit 提供的百度定位代碼,謝謝!
新版本插件地址:
下面步入正題,通過一個(gè)簡單的安卓 hello world 程序來運(yùn)用百度定位插件
1、建立 hello world 項(xiàng)目:
cordova create hello com.example.hello HelloWorld
2、建立安卓支持,目前本插件只支持安卓,似乎也只要支持安卓,ios對(duì)html5的定位支持的非常好,無須百度定位SDK
cordova platform add android
3、安裝 baidu 定位的插件:
可以通過git來下載遠(yuǎn)程的,需要安裝git命令
cordova plugin add https://github.com/DoubleSpout/phonegap_baidu_sdk_location.git
也可以將插件下載到 hello\plugins 目錄下,文件夾重命名為 com.spout.phonegap.plugins.baidulocation,然后執(zhí)行命令:
cordova plugin install com.spout.phonegap.plugins.baidulocation
4、插件安裝完成之后,執(zhí)行一次 build 命令,將插件的配置文件寫入安卓平臺(tái)目錄:
5、打開eclipse,對(duì)hello項(xiàng)目進(jìn)行配置:
5.1、新建工程
5.10、選擇order and export 將前面全部打勾
5.11、將文本編輯編碼改為utf-8
5.12、打開 hello\platforms\android\src\com\spout\phonegap\plugins\baidulocation\BaiduLocation.java 文件,修改自己的apkkey(其實(shí)不修改也能使用),大約在64行:
key的生成和獲取詳見百度sdk的key獲取頁面,地址:
6、找到 hello\www\js\index.js 文件,修改并增加如下幾行,通過百度SDK獲取經(jīng)緯度:
onDeviceReady: function() {
app.receivedEvent('deviceready');
//通過百度sdk來獲取經(jīng)緯度,并且alert出經(jīng)緯度信息
var noop = function(){}
window.locationService.getCurrentPosition(function(pos){
alert(JSON.stringify(pos))
window.locationService.stop(noop,noop)
},function(e){
alert(JSON.stringify(e))
window.locationService.stop(noop,noop)
});
},
7、完成上述工作后,執(zhí)行命令打包生產(chǎn)APK,注意百度定位的SDK在模擬器上是無法運(yùn)行的,會(huì)曝出167錯(cuò)誤碼
8、將 hello\platforms\android\ant-build\HelloWorld-debug-unaligned.apk 文件拷貝到之前有問題的安卓4.1的機(jī)器上,顯示如下圖,通過wifi成功快速獲取到經(jīng)緯度信息,再也不用重啟機(jī)子了:
至此百度SDK說明完畢,希望能夠幫助到利用phonegap開發(fā)安卓應(yīng)用,又碰到我這樣問題的朋友~