同步在多个Android设备上记录数据的时间

时间:2012-06-25 14:04:36

标签: android time gps

这个问题可能略显啰嗦,但对许多建议持开放态度。


问题陈述:
我们有几个API级别8(Android 2.2)MyTouch设备,我们将用它们来记录游乐园的加速度数据,即过山车。我们还有一个可视化功能,允许我们绘制和查看加速度计点作为记录时间的函数。这就是我们陷入两难的地方! Android设备上的系统时间不尽相同,也不能以毫秒精度设置为同一时间(仅手动精确分钟,这很糟糕)。


解决方案尝试:
所以,我首先根据应用程序启动时发现的GPS时间记录数据。长进程短:获取GPS时间,获取系统时间,获得差异,并在记录数据点时,再次获得系统时间并将差异添加回时间,标记为记录的开始时间,并为每个增加200毫秒从那里记录数据点。但是,有2个问题(获取GPS时间):

  • 使用getLastKnownLocation()并不太准确。实际上,它似乎非常不准确。它给我的时间比目前的GMT / UTC时间少9分钟。巧合的是,Android设备上的系统时间也接近9分钟...... GPS时间和系统时间之间的差异通常在1000到5000毫秒(1到5秒)之间。我想我的代码有可能是错的。我把它贴在下面给你看。

  • requestSingleUpdate()会很好用,因为它会获得更新的位置,也许是非常准确的时间。问题?需要API级别9 ...我们没有的设备。


思路:
这是我的一个想法 - 如果我以某种方式从网站上抽出全球时间并使用从那里拉出的时间作为录制时间怎么办?问题在这里 - 我不知道该怎么做,这只是我的一厢情愿......

另一个想法 - 是否有某种全局getTime()类型的函数我根本不知道?


推理为什么我希望Android从类似的时钟中抽出时间:
想象一下,两个人坐在过山车上 - 一个在前排座位上,一个在后排座位上。在记录数据时,前面的人显然会在后面的人之前略微加速(我们希望在我们的可视化图上看到这一点)。这就是为什么以毫秒精度来说,根据一个全球时间记录这些点是至关重要的。


代码:

Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);

if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    mLocationManager.requestLocationUpdates(mLocationManager.getBestProvider(c, true), 0, 0, AmusementPark.this);
    Criteria criteria = new Criteria();
    String bestProvider = mLocationManager.getBestProvider(criteria, false);
    Location location = mLocationManager.getLastKnownLocation(bestProvider);

    try {

        gpsTime = location.getTime();
        systemTime = System.currentTimeMillis();
        timeDif = gpsTime - systemTime;
        Log.e("timedif", "GPS: " + gpsTime + ", System: " + systemTime +", Dif: " + timeDif);

    } catch (NullPointerException e){

    }

}

更新
Here,有人建议使用某种“服务器”getTime()。我真的很喜欢他的代码/答案,但这个“服务器”是什么和/或如果这是最好的解决方案我该如何设置?

1 个答案:

答案 0 :(得分:2)

我认为响应者在该帖子中提到的“服务器”是设置专用时间服务器。基本上你会设置一些硬件,所有使用你的应用程序的人都会连接到这些硬件以获得时间。这可能比你愿意付出的努力更多。

您需要以下内容,

  1. 一些备用硬件(可能像运行tomcat的计算机一样简单,也可能像专用服务器机架一样复杂,具体取决于您认为将使用您的应用程序的人数。)或订阅域服务器/网站主持人。

  2. 某个网络服务只会在应用请求时返回时间。

  3. 您需要公开您的服务器/网络服务,这是另一个令人头疼的问题。

  4. 我不确定这是否是您最好的解决方案,因为它取决于网络连接到达您的专用服务器。您可以尝试几种替代解决方案:

    我不知道您的应用是公开还是专门用于研究。如果它是后者,它将由一群你知道并且可以协调的人组成,我实际上建议您只需下载ClockSync,将手机同步到同一时间服务器,然后执行你的应用程序。

    如果您的应用程序将分发给您将无法联系的人,那么最好的办法是让您的应用程序与一台ntp服务器建立连接并抓住时间。以下是您可以使用的公共ntp服务器列表:http://www.pool.ntp.org/en/

    以下是更多信息:

    ClockSync

    Sample code用于建立SNTP连接

    我希望您在做出决定时可以使用这些信息。