2012-06-25 89 views
7

此问题可能稍微冗长,但对于很多建议都是开放的。用于在多个Android设备上录制数据的同步时间


问题陈述:
我们有几个API级别8(Android 2.2的),我们将使用在游乐园记录加速度数据,即坐在过山车上的myTouch设备。我们还有一个可视化功能,使我们可以根据它们记录的时间函数绘制和查看加速度计点。这里是我们两难的地方! Android设备上的系统时间不完全相同,它们也不能以毫秒精度设置为同一时间(只能以微小精度手动执行,这很糟糕)。


解决方案尝试:
所以,我根据在应用的开始找到GPS第一时间使出记录数据。处理时间短:获得GPS时间,获得系统时间,获得差异,并在记录数据点时,再次获取系统时间并将差值重新添加到时间上,标记为记录的开始时间,并且为每个时间增加200毫秒从那里记录数据点。但是,有2个问题(获取GPS时间):

  • 使用getLastKnownLocation()不太准确。其实,这看起来很不准确。它给我的时间比现在的格林尼治标准时间/世界标准时间还要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()的。我真的很喜欢他的代码/答案,但是这个“服务器”是什么和/或我如何设置它,如果这是最好的解决方案?

回答

2

我认为响应者在这篇文章中提到的“服务器”是设置一个专用的时间服务器。基本上你会设置一些硬件,所有的人使用你的应用程序将连接到,以获得时间。这可能是更多的努力比你愿意把英寸

你会需要满足以下条件,

  1. 一些备用的硬件(可能为计算机运行Tomcat一样简单,或作为复杂专用服务器机架,具体取决于您认为将使用您的应用的人数)或订购域服务器/ Web主机。

  2. 某些Web服务只是在应用程序请求它时返回时间。

  3. 你需要让你的服务器/ web服务公开,这是一个令人头痛的问题。

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

我不知道您的应用是否会公开或专门用于研究。如果是后者,它将与一组您认识并可以协调的人员合作,我建议您只需下载ClockSync,将手机同步到同一时间服务器,然后执行您的应用程序。

如果你的应用程序将被分发给你不会接触的人,那么最好的办法就是让你的应用程序与一个ntp服务器建立连接,并抓住时间。这里是公共NTP服务器的列表,你可以使用:http://www.pool.ntp.org/en/

这里的一些信息:

ClockSync

Sample code用于制造SNTP连接

我希望这些信息可以利用来你在做决定。

+0

我们实际上正在和我们的服务器进行通信 - 我将会看看其中一个人是否会编写一个API函数,从服务器获取时间,然后我们可以通过Android设备进行通信。感谢代码 - 非常有帮助。如果这项工作/不成功,我会尽快回复您。 – Mxyk

+1

感谢您的帮助 - 我们决定使用DatagramSockets在类似的WiFi网络上主持/接收时间,以便所有手机都能同步到主持手机的时间。如果我有任何DatagramSocket问题,我一定会问。 – Mxyk

+0

@Mxyk您是否准确地将移动设备上的时间同步到了? – flux

相关问题