首页 文章

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

提问于
浏览
7

我在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 回答

  • 2

    好的,经过长时间的调试,我发现了问题 . 显然,getCurrentPosition()函数在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应用程序,我总是应用上述 .

  • 25

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

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

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

    从不如此,这些值在正常访问时有效 .

  • 0

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

    location = angular.copy(location)
    

相关问题