Cordova地理位置插件在安卓上返回空的位置对象

8

我曾经遇到过 Geolocation Cordova 插件 (org.apache.cordova.geolocation) 的问题,它在 iOS 上运行良好,但在 Android 上完全不起作用。

据我所知,该插件曾包括原生 Android 代码,但在某个时刻被删除了,因为它太多错误/速度太慢,而本地Web HTML5实现更加稳定和快速。

如果我使用最新的插件版本 (0.3.2),其中仍然包含原生代码,它确实可以工作(但是比较缓慢,而且并非总是如此)。但当返回时,位置对象总是填充的。

如果我使用最新的插件版本 (1.0.1),getCurrentPosition() 立即返回一个空对象 ({})。它不会抛出错误。

如果我完全删除插件,并手动将权限添加到 Android 项目中:

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

同样的事情发生了。我只是无法让它工作,但这并没有意义。Android控制台中没有显示任何错误。有什么想法吗?
3个回答

29

好的,经过漫长而艰苦的调试后,我找到了问题所在。显然,在 Android 中,getCurrentPosition()函数返回一个“特殊”的对象,当使用 JSON.stringify()时会评估为 {}。如果我将原始返回对象输出到控制台,则发现它根本不为空。

因此,以下荒谬的调整修复了我的代码:

navigator.geolocation.getCurrentPosition(function (position) {
    var positionObject = {};

    if ('coords' in position) {
        positionObject.coords = {};

        if ('latitude' in position.coords) {
            positionObject.coords.latitude = position.coords.latitude;
        }
        if ('longitude' in position.coords) {
            positionObject.coords.longitude = position.coords.longitude;
        }
        if ('accuracy' in position.coords) {
            positionObject.coords.accuracy = position.coords.accuracy;
        }
        if ('altitude' in position.coords) {
            positionObject.coords.altitude = position.coords.altitude;
        }
        if ('altitudeAccuracy' in position.coords) {
            positionObject.coords.altitudeAccuracy = position.coords.altitudeAccuracy;
        }
        if ('heading' in position.coords) {
            positionObject.coords.heading = position.coords.heading;
        }
        if ('speed' in position.coords) {
            positionObject.coords.speed = position.coords.speed;
        }
    }

    if ('timestamp' in position) {
        positionObject.timestamp = position.timestamp;
    }

    // Use the positionObject instead of the position 'object'
    alert(JSON.stringify(positionObject));            
}

iOS在没有进行上述调整的情况下也可以正常运行,但由于我的应用是一个Phonegap应用程序,我总是会进行上述调整。


iOS在不进行以上调整的情况下亦能良好运作,但因我的应用为Phonegap应用,故我一直使用以上调整。

2
谢谢。原来coordstimestampGeolocation原型的getter,我猜JSON.stringify只输出对象自身的属性。 - Nick Bedford
1
工作正常,谢谢。 - kimo

2

navigator.geolocation.getCurrentLocation()回调函数中传递的Geolocation对象包含两个原型(prototype)获取器coordstimestamp,这意味着hasOwnProperty会返回false,我认为JSON.stringify也会排除它们。

当记录对象上所有键时,我得到以下结果:

[object Geoposition]
  .coords [object Coordinates]
     .latitude
     .longitude
     .altitude
     .accuracy 
     .altitudeAccuracy
     .heading
     .speed
  .timestamp

然而,当正常访问时,这些值仍然有效。


那解决了问题。谢谢! - Flock Dawson

0

使用Angular,您可以通过以下方式解决此问题:

location = angular.copy(location)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接