【问题标题】:Phonegap geolocation sometimes not working on androidPhonegap 地理定位有时无法在 android 上运行
【发布时间】:2014-06-16 12:25:33
【问题描述】:

我使用cordova v3.4.1 构建android 和ios 应用程序,在ios 上的地理定位功能返回非常快,并且总是可以正常工作,但在android 上,有时它不工作。

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

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

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

我测试过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>

【问题讨论】:

    标签: android cordova geolocation


    【解决方案1】:

    我终于解决了问题,现在在我的安卓手机上,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

    【讨论】:

    • 这个问题在 PG 3.5 上仍然存在,您的解决方案仍然有效!
    • 我们还需要在 PG 5.1.1 中完成所有这些吗?大多数时候 navigator.geolocation.getCurrentPosition() 在我的 Android 设备上根本不起作用。重启也无济于事。
    • 很抱歉提出这个话题——我们在构建 phonegap 时如何解决这个问题。这些变化是否仍然有效?我没有看到任何区别,因此问
    • .copy the plugin to e:` what is e` 在这里?我正在使用离子
    【解决方案2】:

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

    1、cordova插件移除cordova-plugin-geolocation

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

    3、将你的插件目录中的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位置很好。感谢吴中华。

    【讨论】:

    • 我在 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。你弄明白了吗?
    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多