問題描述
我使用cordova v3.4.1 來構(gòu)建android 和ios 應(yīng)用程序,在ios 上的地理定位功能返回非常快并且總是可以正常工作,但在android 上,有時它不工作.
I have using cordova v3.4.1 to build android and ios app, on ios geolocation function is returning very quickly and works fine always,but on android, sometimes it not working.
奇怪的是,在我重啟我的安卓手機(jī)后,它工作正常.在 wifi 和 3G 中,地理定位在幾個多小時內(nèi)都非常迅速地獲得了位置.
The strange thing is after I reboot my android phone,it works fine. In more than a few hours geolocation gets the postion very quickly both in wifi and 3G.
但是過了幾個小時,我再次打開應(yīng)用程序,地理定位無法工作.有時當(dāng)我在外面時,它可以用gps衛(wèi)星定位,但速度很慢,經(jīng)常出現(xiàn)超時錯誤.
But after serval hours, I open the app again, the geolocation can not work.Sometimes when I outside, it can get postion with gps satellite,but very slow,often occur timeout error.
我嘗試刪除該應(yīng)用并重新安裝它,但問題仍然存在,除非重新啟動我的安卓手機(jī).當(dāng)我重新啟動我的安卓手機(jī)時,地理定位功能在未來幾個小時內(nèi)再次正常工作.
I try to remove the app and reinstall it again,but the problem still exist,unless reboot my android phone.when I reboot my android phone,geolocation function is working fine again in future a few hours.
我測試過samsang note2、galaxy4等安卓手機(jī),都出現(xiàn)同樣的問題.重啟后,他們可以非常快速地獲取位置.
I have test serval android`s phone such as samsang note2, galaxy4 etc, they all have the same problem.when I reboot it, they can get location very quicly.
這個問題困擾了我很久,有大神幫忙嗎?
This problem has troubled me for a long time, so somebody help me?
下面是我的代碼:
navigator.geolocation.getCurrentPosition(function(pos){
cb(null,pos)
},function(errMsg){
navigator.geolocation.getCurrentPosition(function(pos){
cb(null,pos)
},function(errMsg){
cb(errMsg)
}, {
enableHighAccuracy: true,
timeout: 60*1000*2,
maximumAge: 1000*60*10
});
}, {
enableHighAccuracy: false,
timeout: 10*1000,
maximumAge: 1000*60*10
});
我的 config.xml:
my config.xml:
<feature name="Geolocation">
<param name="android-package" value="org.apache.cordova.geolocation.GeoBroker" />
</feature>
推薦答案
終于解決了問題,現(xiàn)在在我的安卓手機(jī)上,getCurrentPosition
函數(shù)每次都很快返回位置信息,我從來不需要再次重啟我的手機(jī)!我不確定 cordova v3.4.1 的地理定位插件是否有錯誤.
Finally I have solve the problem,now on my android phone, getCurrentPosition
function return location infomation very quickly every time, I never need reboot my phone again!
I'm not sure wether cordova v3.4.1’s geoloation plugin has bugs.
出現(xiàn)這個問題的原因是我們總是使用瀏覽器的navigator.geolocation.getCurrentPosition
函數(shù)來定位位置,所以我們必須讓app使用cordova原生實(shí)現(xiàn)而不是html5.
The reason to occur this problem is we always to use browser's navigator.geolocation.getCurrentPosition
function to locate the postion,so we must let app use cordova native implementation instead of html5.
這里是cordova v3.4.1的解決方案,希望對你有幫助,事實(shí)上它已經(jīng)解決了我的問題.
Here is the the solution with cordova v3.4.1, hope it can help you,in fact it has resolved my question.
解決步驟:
1.刪除org.apache.cordova.geolocation
1.remove the org.apache.cordova.geolocation
$ cordova plugin rm org.apache.cordova.geolocation
2.重新安裝一個新的 org.apache.cordova.geolocation 插件
2.reinstall a new org.apache.cordova.geolocation plugin
$ cordova plugin add org.apache.cordova.geolocation
3.將插件復(fù)制到e:
進(jìn)入插件文件夾,如‘YOUR_APP_FOLDERplugins’
enter the plugin folder,such as ‘YOUR_APP_FOLDERplugins’
將洞org.apache.cordova.geolocation
復(fù)制到E:org.apache.cordova.geolocation
4.再次移除插件
$ cordova plugin rm org.apache.cordova.geolocation
5.編輯E:org.apache.cordova.geolocationplugin.xml中的
plugin.xml
如下編輯 plugin.xml 文件:
edit the plugin.xml file like below:
... ...
<name>Geolocation</name>
<description>Cordova Geolocation Plugin</description>
<license>Apache 2.0</license>
<keywords>cordova,geolocation</keywords>
<repo>https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git</repo>
<issue>https://issues.apache.org/jira/browse/CB/component/12320638</issue>
<!-- android Code Comments
<platform name="android">
<config-file target="AndroidManifest.xml" parent="/*">
<uses-permissionandroid android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
</config-file>
</platform>
-->
<!-- amazon-fireos change to android-->
<platform name="android">
<js-module src="www/Coordinates.js" name="Coordinates">
<clobbers target="Coordinates" />
</js-module>
<js-module src="www/PositionError.js" name="PositionError">
<clobbers target="PositionError" />
</js-module>
<js-module src="www/Position.js" name="Position">
<clobbers target="Position" />
</js-module>
<js-module src="www/geolocation.js" name="geolocation">
<clobbers target="navigator.geolocation" />
</js-module>
<config-file target="res/xml/config.xml" parent="/*">
<feature name="Geolocation">
<param name="android-package" value="org.apache.cordova.geolocation.GeoBroker"/>
</feature>
</config-file>
<config-file target="AndroidManifest.xml" parent="/*">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
</config-file>
<source-file src="src/amazon/GeoBroker.java" target-dir="src/org/apache/cordova/geolocation" />
<source-file src="src/amazon/GPSListener.java" target-dir="src/org/apache/cordova/geolocation" />
<source-file src="src/amazon/NetworkListener.java" target-dir="src/org/apache/cordova/geolocation" />
<source-file src="src/amazon/CordovaLocationListener.java" target-dir="src/org/apache/cordova/geolocation" />
</platform>
<!-- ios -->
<platform name="ios">
... ...
6.再次添加插件
$ cordova plugin add E:org.apache.cordova.geolocation
7、運(yùn)行build commond
7、run build commond
$ cordova build android
8.檢查是否正常
檢查 YOUR_APPpluginsandroid.json
必須包括:
{
"xml": "<feature name="Geolocation"><param name="android-package" value="org.apache.cordova.geolocation.GeoBroker" /></feature>",
"count": 1
},
... ...
{
"xml": "<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />",
"count": 4
},
{
"xml": "<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />",
"count": 4
},
{
"xml": "<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />",
"count": 1
}
檢查 YOUR_APPplatformsandroidAndroidManifest.xml
必須包括:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
檢查 YOUR_APPplatformsandroid
esxmlconfig.xml
必須包括:
<feature name="Geolocation">
<param name="android-package" value="org.apache.cordova.geolocation.GeoBroker" />
</feature>
9.運(yùn)行應(yīng)用程序
編寫地理定位代碼以獲取 lat 和 lng:
write the geelocation code to get lat and lng:
navigator.geolocation.getCurrentPosition(function(pos){
alert('suc')
alert(JSON.stringify(pos))
},function(errMsg){
alert(JSON.stringify(errMsg))
navigator.geolocation.getCurrentPosition(function(pos){
alert('suc')
alert(JSON.stringify(pos))
},function(errMsg){
alert(JSON.stringify(errMsg))
}, {
enableHighAccuracy: true,
timeout: 60*1000*2,
maximumAge: 1000*60*10
});
}, {
enableHighAccuracy: false,
timeout: 60*1000,
maximumAge: 1000*60*10
});
如果您的手機(jī)支持使用 wifi/3G 定位,那么我們將立即獲取位置,否則您將看到 errMsg 超時
,然后 geolocation
將使用 gps 定位位置本機(jī)實(shí)現(xiàn).
if your phone support use wifi/3G locate then we will get location immediately,else you will see the errMsg timeout
and then geolocation
will use gps to locate postion with native implement.
現(xiàn)在我們得到了 lat 和 lng,再也不需要重啟安卓手機(jī)了,謝天謝地.
now we get the lat and lng, and never need reboot the android phone agian,thank goodness.
如果還是有問題,嘗試安裝插件清理webview緩存:
if you still have the problem,try to install the plugin to clean the webview cache:
https://github.com/moderna/cordova-plugin-cache
這篇關(guān)于Phonegap 地理定位有時無法在 android 上運(yùn)行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!