【发布时间】:2018-06-09 08:36:25
【问题描述】:
自从最新的 Android 更新 (v. 8) 以来,我在尝试读取传感器时发现了一个非常奇怪的行为。更具体地说,我说的是 WiFi 和蜂窝塔。这里有两个例子:
当我读取 WiFi 接入点信息数据并尝试使用此代码将 accessPoint.timestamp 转换为绝对时间戳时:
long timeInMillis = System.currentTimeMillis() + ((accessPoint.timestamp * 1000L -
SystemClock.elapsedRealtimeNanos()) / 1000000L);
但是,当我使用 nearbyCellTowers = mTelephonyManager.getAllCellInfo(); 阅读 Cell Towers 时,相同的代码无法正常工作,我必须使用其他代码:
long timeInMillis = System.currentTimeMillis() + ((gsmRecord.getTimeStamp() -
System.nanoTime()) / 1000000L);
如果您没有注意到区别,那是在使用 SystemClock.elapsedRealtimeNanos() 或 System.nanoTime()。
根据 Android 文档 getTimeStamp() 是:
getTimeStamp(): 自启动以来此单元格信息的近似时间(以纳秒为单位)
WiFi 类似:
时间戳: 上次看到此结果时的时间戳(以微秒为单位)。
虽然描述看起来相同(自启动以来的时间),但值却完全不同。可以看到,WiFi时间戳相当于SystemClock.elapsedRealtimeNanos()的值,而CellInfo时间戳相当于System.nanoTime()。
除非我调试并查看结果,否则我永远不能说哪一个可以与这两个函数中的哪一个一起工作。我在这里错过了什么吗?有人可以为我澄清一下吗?这两个函数的主要区别是什么?为什么描述相同的两个时间戳的值不同?
【问题讨论】:
-
你好!您是否能够在所有平台上以任何方式解决此问题?我的意思是,根据我的理解,简单地使用 System.nanoTime 会破坏旧的 Android 版本。而如果我们想在不同的 Android 版本上使用不同的方法,我们需要具体了解哪些 Android 版本的行为方式。还是特定于供应商?
-
@FreeNickname 如果可能,请提供您的测试结果。
标签: java android timestamp elapsedtime nanotime