我终于解决了问题,现在我的安卓手机上getCurrentPosition
函数每次都可以快速返回位置信息了,再也不需要重新启动手机了!我不确定cordova v3.4.1的地理位置插件是否有bug。
导致这个问题发生的原因是我们一直使用浏览器的navigator.geolocation.getCurrentPosition
函数来定位位置,所以我们必须让应用程序使用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>
<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>
<platform name="ios">
... ...
6. 再次添加插件
$ cordova plugin add E:\org.apache.cordova.geolocation
7、运行构建命令
$ 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.运行应用程序
编写Geolocation代码以获取纬度和经度:
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来定位位置。
现在我们已经获得了纬度和经度,再也不需要重新启动安卓手机,谢天谢地。
如果您仍然有问题,请尝试安装清除Webview缓存的插件:
https://github.com/moderna/cordova-plugin-cache