17

我正在获取我的最后一个已知位置,但不知道我的位置上次更新以来的时间。我如何才能知道自上次更新位置以来已经过去了多长时间?

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

4 回答 4

25

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

}

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

于 2014-03-28T16:35:38.990 回答
7

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

getTime() 的时基是从 GPS 模块接收到的 NMEA 语句确定的 UTC,而不是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

于 2015-02-22T17:42:49.247 回答
5

Location.getTime() 实际上并不是查找最后一个已知位置的年龄的最佳方法。

来自 JavaDoc:

返回此修复的 UTC 时间,以 1970 年 1 月 1 日以来的毫秒数为单位。

请注意,设备上的 UTC 时间不是单调的:它可以不可预测地向前或向后跳跃。所以在计算时间增量时总是使用 getElapsedRealtimeNanos。

使用的两种方法是:

SystemClock.elapsedRealtimeNanos();
Location.getElapsedRealtimeNanos();

另请注意,LocationManager.lastKnownLocation() 可能返回 null。

于 2014-03-15T20:03:49.350 回答
1

每个位置都有一个属性时间。获取它getTime().与当前时间比较。(计算差异)。这给了你“年龄”。

于 2013-03-09T12:19:52.370 回答