Phonegap 地理定位有时无法在 android 上运行 [英] Phonegap geolocation sometimes not working on android

查看:19
本文介绍了Phonegap 地理定位有时无法在 android 上运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用cordova v3.4.1 来构建android 和ios 应用程序,在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.

奇怪的是,在我重启我的安卓手机后,它工作正常.在 wifi 和 3G 中,地理定位在几个多小时内都非常迅速地获得了位置.

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.

但是过了几个小时,我再次打开应用程序,地理定位无法工作.有时当我在外面时,它可以用gps卫星定位,但速度很慢,经常出现超时错误.

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.

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

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等安卓手机,都出现同样的问题.重启后,他们可以非常快速地获取位置.

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>

推荐答案

终于解决了问题,现在在我的安卓手机上,getCurrentPosition函数每次都很快返回位置信息,我从来不需要再次重启我的手机!我不确定 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.

出现这个问题的原因是我们总是使用浏览器的navigator.geolocation.getCurrentPosition函数来定位位置,所以我们必须让app使用cordova原生实现而不是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的解决方案,希望对你有帮助,事实上它已经解决了我的问题.

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.将插件复制到e:

进入插件文件夹,如‘YOUR_APP_FOLDERplugins’

enter the plugin folder,such as ‘YOUR_APP_FOLDERplugins’

将洞org.apache.cordova.geolocation复制到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、运行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.运行应用程序

编写地理定位代码以获取 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

});

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

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.

现在我们得到了 lat 和 lng,再也不需要重启安卓手机了,谢天谢地.

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

这篇关于Phonegap 地理定位有时无法在 android 上运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆