Phonegap地理定位有时不适用于android

时间:2014-04-30 08:54:36

标签: android cordova geolocation

我已经使用cordova v3.4.1来构建android和ios应用程序,在ios地理位置函数返回非常快并且工作正常,但在android上,有时它无法正常工作。

奇怪的是我重新启动Android手机后,它运行正常。在不到几个小时的时间内,地理位置在wifi和3G中都会非常快速地占据位置。

但是在服用小时之后,我再次打开应用程序,地理位置无法正常工作。有时当我在外面时,它可以获得gps卫星的位置,但速度很慢,经常会发生超时错误。

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

我有测试serval 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
});

我的config.xml:

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

2 个答案:

答案 0 :(得分:16)

最后我已经解决了这个问题,现在在我的Android手机上,getCurrentPosition函数每次都很快返回位置信息,我再也不需要重新启动手机了! 我不确定cordova v3.4.1的geoloation插件是否有错误。

出现此问题的原因是我们总是使用浏览器的navigator.geolocation.getCurrentPosition函数来定位位置,因此我们必须让app使用cordova本机实现而不是html5。

这是cordova v3.4.1的解决方案,希望它可以帮到你,事实上它解决了我的问题。

解决步骤:

1.删除org.apache.cordova.geolocation

$ cordova plugin rm org.apache.cordova.geolocation

2.reinstall一个新的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.编辑plugin.xml

中的E:\org.apache.cordova.geolocation\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.add插件再次

$ 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.运行应用程序

编写geelocation代码以获取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,并且永远不需要重启android手机,谢天谢地。

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

https://github.com/moderna/cordova-plugin-cache

答案 1 :(得分:0)

在cordova v5.3.3上,你需要这样做:

1,cordova插件删除cordova-plugin-geolocation

2,cordova插件添加cordova-plugin-geolocation

3,将plguins目录中的cordova-plugin-geolocation目录复制到e:\

4,编辑plugin.xml,添加:

<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>

5,cordova插件删除cordova-plugin-geolocation

6,cordova插件添加e:\ cordova-plugin-geolocation

7,cordova运行android 现在,我的gps位置很好。谢谢吴中华。