我正在获取我最后一个已知位置,但不知道自我的位置上次更新以来已经有多长时间了。我怎样才能知道自该位置上次更新以来已经有多长时间?
LocationManager locationManager
= (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);
c.setAccuracy(Criteria.ACCURACY_COARSE);
c.setAltitudeRequired(false);
c.setBearingRequired(false);
c.setCostAllowed(true);
c.setPowerRequirement(Criteria.POWER_HIGH);
String provider = locationManager.getBestProvider(c, true);
Location location = locationManager.getLastKnownLocation(provider);
答案 0 :(得分:24)
API 17之前和之后的最佳选择:
public int age_minutes(Location last) {
return age_ms(last) / (60*1000);
}
public long age_ms(Location last) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
return age_ms_api_17(last);
return age_ms_api_pre_17(last);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private long age_ms_api_17(Location last) {
return (SystemClock.elapsedRealtimeNanos() - last
.getElapsedRealtimeNanos()) / 1000000;
}
private long age_ms_api_pre_17(Location last) {
return System.currentTimeMillis() - last.getTime();
}
前17不是很准确,但应足以测试位置是否很旧。
我认为这应该没问题:
if (age_minutes(lastLoc) < 5) {
// fix is under 5 mins old, we'll use it
} else {
// older than 5 mins, we'll ignore it and wait for new one
}
此逻辑的常用用例是应用程序刚刚启动时我们需要知道我们必须等待新位置,或者我们等待新的时候可以使用最新版本位置。
答案 1 :(得分:7)
很抱歉重新打开这个,但我认为韦斯顿的回答不正确, 并且Android文档至少具有误导性。
getTime()的时基是从中确定的UTC 从GPS模块收到的NMEA语句,不 System.currentTimeMillis()。全球定位系统 时间精确到纳秒(必须是因为电磁波在1ns内行进30cm)。该 这里唯一的复杂因素可能是1s到期 到GPS闰秒(见[1];这可能发生 在每隔几年的几分钟内,假设GPS足够智能以记住电力循环中的UTC偏移量
另一方面,System.currentTimeMillis()可以关闭几个 由于漂移而导致的秒/分钟,或者如果用户错误地设置时间/日期则更多。
因此,API 17之前唯一真正的解决方案是 定期接收位置更新和每次记录 你自己的时间戳基于SystemClock.elapsedRealtime()。
我刚在三星S4上试过这个,如果有其他手机,请纠正我 给出不同的结果。不过我对此表示怀疑。
[1] http://en.wikipedia.org/wiki/Global_Positioning_System#Leap_seconds
答案 2 :(得分:5)
Location.getTime()实际上不是查找上一个已知位置的年龄的最佳方式。
来自JavaDoc:
返回此修复的UTC时间,自1970年1月1日起以毫秒为单位。
请注意,设备上的UTC时间不是单调的:它可以无法预测地向前或向后跳跃。所以在计算时间增量时总是使用getElapsedRealtimeNanos。
使用的两种方法是:
SystemClock.elapsedRealtimeNanos();
Location.getElapsedRealtimeNanos();
另请注意,LocationManager.lastKnownLocation()可能会返回null。
答案 3 :(得分:1)
每个位置都有一个属性时间。通过getTime().
获取它与当前时间进行比较。 (计算差异)。这给你“年龄”。