【问题标题】:Cordova Geolocation plugin returning empty position object on AndroidCordova Geolocation 插件在 Android 上返回空位置对象
【发布时间】:2015-12-29 04:19:46
【问题描述】:

我在 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 控制台中不会显示任何错误。有什么想法吗?

【问题讨论】:

    标签: android html cordova geolocation cordova-plugins


    【解决方案1】:

    好的,经过长时间的调试,我发现了问题。显然,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 应用程序,所以我总是应用上述内容。

    【讨论】:

    • 谢谢。结果coordstimestampGeolocation 原型getter,我猜JSON.stringify 只输出对象自己的属性。
    • 工作,谢谢
    【解决方案2】:

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

    当记录对象上的所有键时,我得到以下信息:

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

    无论如何,这些值在正常访问时都是有效的。

    【讨论】:

    • 这说明了问题。谢谢!
    【解决方案3】:

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

    location = angular.copy(location)
    

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多