我终于解决了问题,现在在我的安卓手机上,getCurrentPosition 函数每次都非常快速地返回位置信息,我再也不需要重启手机了!
我不确定 cordova v3.4.1 的地理定位插件是否有错误。
出现这个问题的原因是我们总是使用浏览器的navigator.geolocation.getCurrentPosition函数来定位位置,所以我们必须让app使用cordova原生实现而不是html5。
这是cordova v3.4.1的解决方案,希望它可以帮助你,事实上它已经解决了我的问题。
解决步骤:
1.删除org.apache.cordova.geolocation
$ cordova plugin rm org.apache.cordova.geolocation
2.重新安装一个新的 org.apache.cordova.geolocation 插件
$ cordova plugin add org.apache.cordova.geolocation
3.将插件复制到e:\
进入插件文件夹,如‘YOUR_APP_FOLDER\plugins\’
将洞org.apache.cordova.geolocation复制到E:\org.apache.cordova.geolocation
4.再次移除插件
$ cordova plugin rm org.apache.cordova.geolocation
5.编辑E:\org.apache.cordova.geolocation\plugin.xml中的plugin.xml
如下编辑 plugin.xml 文件:
... ...
<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、运行build commond
$ cordova build android
8.检查是否正常
检查YOUR_APP\plugins\android.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_APP\platforms\android\AndroidManifest.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_APP\platforms\android\res\xml\config.xml必须包括:
<feature name="Geolocation">
<param name="android-package" value="org.apache.cordova.geolocation.GeoBroker" />
</feature>
9.运行应用程序
编写地理定位代码以获取 lat 和 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
});
如果您的手机支持使用 wifi/3G 定位,那么我们将立即获取位置,否则您将看到 errMsg timeout 然后 geolocation 将使用 gps 使用原生工具定位位置。
现在我们得到了 lat 和 lng,再也不需要重启安卓手机了,谢天谢地。
如果还是有问题,尝试安装插件清理webview缓存:
https://github.com/moderna/cordova-plugin-cache