从LocationServices返回的位置年龄

时间:2015-09-11 10:58:00

标签: android location-services

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

有没有办法找出LocationServices.FusedLocationApi.getLastLocation返回的位置结果的年龄?

如果不是:如果我向LocationServices.FusedLocationApi.requestLocationUpdatessetNumUpdates(1)setMaxWaitTime(0))注册了位置监听器,那么如果位置没有从{LocationServices.FusedLocationApi.getLastLocation返回的位置发生变化,它会更新吗? 1}}?

2 个答案:

答案 0 :(得分:4)

是的,有一种非常简单的方法。您可以通过这样调用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()

答案 1 :(得分:0)

为了扩展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();

if (locationAge <= 60 * 1000) { // not older than 60 seconds
    // do something with the location
}