2019 年 4 月 6 日之后从 Location.getTime 返回的日期错误(周数翻转)

Gal*_*mov 5 gps android android-gps

我有一部已 root 的手机 Samsung N7100 (kitkat 4.4.2)。2019 年 4 月 6 日之后,我开始获取日期为 1999 年的地点。

有时,位置信息的日期为 2019 年,但此后设备将停止接收任何位置信息。

只有 adb 命令有帮助,但一段时间后设备将停止接收任何位置。

settings put secure location_providers_allowed -gps
settings put secure location_providers_allowed +gps
Run Code Online (Sandbox Code Playgroud)

我已经尝试将固件更新到 android 6 和 7。没有任何帮助。

mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, this);
....

public void onLocationChanged(Location location) {
  Log.d(TAG, (new Date(location.getTime())).toLocaleString());
}
Run Code Online (Sandbox Code Playgroud)

uri*_*i2x 7

这与某些类型的 GPS 芯片上出现的GPS 周数翻转问题有关。

解决此问题的一种方法是检测返回的值location.getTime()是否太旧(例如,2019 年之前),如果是,则添加差值(1024 周)。

这段代码应该可以在接下来的 20 年内发挥作用:

long gpsTime = location.getTime();

// Adding 1024 weeks to fix Week Number Rollover issue for old GPS chips
// 619315200000L = 1024 * 7 * 24 * 60 * 60 * 1000   ->  means 1024 weeks
// Note: This fix works for next 20 years since provided timestamp below
// See: /sf/ask/3930332451/
// See: https://www.cisa.gov/gps-week-number-roll-over
if ((gpsTime > 0) && (gpsTime < 1673000000000L))
  gpsTime += 619315200000L;
Run Code Online (Sandbox Code Playgroud)