Cordova Geolocation插件在Android上返回空位置对象

时间:2015-10-01 07:42:01

标签: android html5 cordova geolocation cordova-plugins

我在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 个答案:

答案 0 :(得分:25)

好的,经过长时间的调试,我发现了问题。显然,getCurrentPosition()函数返回一个特殊的&#39; Android中的对象,在使用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应用,我总是应用上述内容。

答案 1 :(得分:2)

传递给Geolocation中回调的navigator.geolocation.getCurrentLocation()对象包含两个原型 getter coordstimestamp,这意味着{{1} }将返回false,我假设hasOwnProperty排除。

记录对象上的所有键时,我得到以下内容:

JSON.stringify

从未如此,这些值在正常访问时有效。

答案 2 :(得分:0)

使用Angular,您可以使用以下方法解决此问题:

location = angular.copy(location)