Phonegap地理定位有时在android上不起作用

Phonegap地理定位有时在android上不起作用,android,cordova,geolocation,Android,Cordova,Geolocation,我已经使用cordova v3.4.1构建了android和ios应用程序,在ios上的地理定位功能恢复得非常快,而且总是很好,但在android上,有时它不起作用 奇怪的是,在我重启安卓手机后,它工作正常。在几小时多的时间里,地理定位在wifi和3G中都能迅速占据一席之地 但几个小时后,我再次打开应用程序,地理定位无法工作。有时当我外出时,它可以用gps卫星定位,但速度很慢,经常发生超时错误 我试图删除该应用程序并重新安装,但问题仍然存在,除非重新启动我的android手机。当我重新启动我的a

我已经使用cordova v3.4.1构建了android和ios应用程序,在ios上的地理定位功能恢复得非常快,而且总是很好,但在android上,有时它不起作用

奇怪的是,在我重启安卓手机后,它工作正常。在几小时多的时间里,地理定位在wifi和3G中都能迅速占据一席之地

但几个小时后,我再次打开应用程序,地理定位无法工作。有时当我外出时,它可以用gps卫星定位,但速度很慢,经常发生超时错误

我试图删除该应用程序并重新安装,但问题仍然存在,除非重新启动我的android手机。当我重新启动我的android手机时,地理定位功能在未来几个小时内再次正常工作

我测试了一些android手机,如samsang note2、galaxy4等,它们都有相同的问题。当我重新启动它时,它们可以非常快速地获得位置

这个问题困扰了我很长时间,有人能帮帮我吗

下面是我的代码:

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
});
my config.xml:

<feature name="Geolocation">
    <param name="android-package" value="org.apache.cordova.geolocation.GeoBroker" />
</feature>

我终于解决了这个问题,现在在我的android手机上,
getCurrentPosition
函数每次都能非常快速地返回位置信息,我再也不需要重新启动手机了! 我不确定cordova v3.4.1的geoloation插件是否有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:\

输入插件文件夹,例如“您的应用程序文件夹\插件”

将洞
org.apache.cordova.geolocation
复制到
E:\org.apache.cordova.geolocation

4.再次删除插件

$ cordova plugin rm org.apache.cordova.geolocation
$ cordova plugin add E:\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">
... ...
7、 运行构建公共

$ cordova build android
8.检查它是否工作正常

检查
你的应用程序\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
 }
<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" />
<feature name="Geolocation">
    <param name="android-package" value="org.apache.cordova.geolocation.GeoBroker" />
</feature>
检查
您的应用程序\platforms\android\res\xml\config.xml
必须包括:

{
   "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
 }
<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" />
<feature name="Geolocation">
    <param name="android-package" value="org.apache.cordova.geolocation.GeoBroker" />
</feature>
}))

如果您的手机支持使用wifi/3G定位,则我们将立即获取位置信息,否则您将看到
errMsg超时
,然后
geolocation
将使用gps使用本机机具定位位置

现在我们得到了lat和lng,而且永远不需要重新启动android手机,谢天谢地

如果仍然存在问题,请尝试安装插件以清理webview缓存:


在cordova v5.3.3上,您需要执行以下操作:

1、 cordova插件移除cordova插件地理位置

$ cordova plugin rm org.apache.cordova.geolocation
2、 cordova插件添加cordova插件地理位置

$ cordova plugin rm org.apache.cordova.geolocation
3、 将plguins目录中的cordova插件地理位置目录复制到e:\

4、 编辑plugin.xml,添加以下内容:


5、 cordova插件移除cordova插件地理位置

$ cordova plugin rm org.apache.cordova.geolocation
6、 cordova插件添加e:\cordova插件地理位置

$ cordova plugin rm org.apache.cordova.geolocation
7、 cordova运行android
现在,我很好地掌握了全球定位系统的位置。谢谢吴中华

这个问题在第3.5页仍然存在,您的解决方案仍然有效!我们还需要在第5.1.1页中完成所有这些吗?大多数情况下,navigator.geolocation.getCurrentPosition()在我的Android设备上根本不起作用。重新启动也无济于事。很抱歉提出这个话题-在进行phonegap构建时,我们如何解决这个问题。这些改变是否仍然有效?我没有看到任何区别,因此问
。将插件复制到e:`what is
e`here?我正在使用ionicI,在mac上安装cordova 5.4.1。我已经完成了您描述的更改,但是在我发布navigator.geolocation.getCurrentPosition(onSuccess,onError)时,从未调用onSuccess或onError方法;有什么想法吗?@Luc用这个
value=“org.apache.cordova.geolocation.GeoBroker”
而不是
value=“org.apache.cordova.geolocation.geolocation
也会破坏我的getCurrentPosition。你明白了吗?