【问题标题】:Age of location returned from LocationServices从 LocationServices 返回的位置年龄
【发布时间】:2015-09-11 10:57:59
【问题描述】:

我需要确保我使用的位置是新鲜的:

有没有办法查出LocationServices.FusedLocationApi.getLastLocation返回的定位结果是多少年?

如果不是:如果我向LocationServices.FusedLocationApi.requestLocationUpdates 注册了一个位置侦听器(使用setNumUpdates(1)setMaxWaitTime(0)),那么如果位置与LocationServices.FusedLocationApi.getLastLocation 返回的位置没有变化,它会更新吗?

【问题讨论】:

    标签: android location-services


    【解决方案1】:

    是的,有一个非常简单的方法。您可以通过调用getTime() 来获取定位修复时间,如下所示:

    Location currentLocation = LocationServices.FusedLocationApi.getLastLocation(apiClient);
    long locationAge = System.currentTimeMillis() - currentLocation.getTime();
    
    if (locationAge <= 60 * 1000) { // not older than 60 seconds
        // do something with the location
    }
    

    文档建议不要使用 System.currentTimeMillis() 进行时间比较,但我从未遇到过这种方法的任何缺陷。但是,您应该考虑阅读(简短的)文档:

    https://developer.android.com/reference/android/location/Location.html#getTime()

    【讨论】:

      【解决方案2】:

      为了扩展 Illiminat 的答案,从 API 17 开始,添加了 getElapsedRealtimeNanos() 方法。从方法的文档...

      返回此修复的时间,自系统启动以来经过的实时时间。

      该值可以可靠地与 SystemClock.elapsedRealtimeNanos() 进行比较,以计算修复的年龄并比较位置修复。这是可靠的,因为每次系统启动都保证了经过的实时时间是单调的,并且即使系统处于深度睡眠状态也会继续增加(与 getTime() 不同。

      https://developer.android.com/reference/android/location/Location.html#getElapsedRealtimeNanos()

      因此,现在应该是最精确的计算方法

      Location currentLocation = LocationServices.FusedLocationApi.getLastLocation(apiClient);
      long locationAge = SystemClock.elapsedRealtimeNanos() - currentLocation.getElapsedRealtimeNanos();
      long ageLimitNanoSec = 60_000_000_000; // 60 seconds in nano seconds
      if (locationAge <= ageLimitNanoSec) { 
          // do something with the location
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多