记录最后一个已知位置的时间是多久以前?

2022-09-02 23:50:28

我获取的是上次已知位置,但不是自上次更新位置以来已存在多长时间。我如何知道自上次更新位置以来已经过了多长时间?

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);

答案 1

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();
}

pre 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

}

此逻辑的常见用例是当应用刚刚启动时,我们需要知道是否必须等待新位置,或者在等待新位置时是否可以暂时使用最新版本。


答案 2

很抱歉重新打开这个,但我认为韦斯顿的答案是不正确的,Android文档至少具有误导性。

getTime() 的时基是 UTC,由从 GPS 模块接收的 NMEA 句子确定,而不是 System.currentTimeMillis()。GPS时间精确到纳秒(它必须是,因为电磁波在1ns内传播30cm)。这里唯一的复杂情况是,由于GPS闰秒,它可能会偏离1秒(参见[1];这可能每隔几年几分钟发生一次,假设GPS足够智能,可以记住整个电源周期的UTC偏移量)

另一方面,System.currentTimeMillis() 可能会因漂移而关闭几秒钟/分钟,如果用户错误地设置时间/日期,甚至更多。

因此,API 17之前唯一真正的解决方案是定期接收位置更新,每次都根据SystemClock.elapsedRealtime()记录自己的时间戳。

我刚刚在三星S4上尝试了这一点,如果其他手机给出不同的结果,请纠正我。不过,我对此表示怀疑。

[1] http://en.wikipedia.org/wiki/Global_Positioning_System#Leap_seconds


推荐