我怎样才能得到“networking”的时间,(从“自动”设置称为“使用networking提供的价值”),而不是在电话上的时间?
我想在我的应用程序find一种方法来同步date和时间与外部来源给予的东西。
我不想使用电话时间,因为我可能会在5分钟左右的实时差异。 5分钟或更less= 10分钟!
我听说过GPS卫星或networking天线中的时间信息。
我已经尝试了System.getCurrentTime,但是我得到了当前的设备,所以,如果我的设备在5分钟之前设置,它显示错误的时间。
编辑
提出一个简短的问题:我怎么能得到这个时间?
我不知道,但发现有趣的问题。 所以我挖在Android代码…谢谢开源:)
你显示的屏幕是DateTimeSettings
。 “使用networking提供的值”checkbox与共享首选项String KEY_AUTO_TIME = "auto_time";
还可以Settings.System.AUTO_TIME
通过在2个networkingServiceStateTracker
s: GsmServiceStateTracker
和CdmaServiceStateTracker
观察到的称为mAutoTimeObserver
观察,可以观察到此设置。
当这些设置变为true时,这两个实现都会调用一个名为revertToNitz()
的方法。 显然, NITZ相当于运营商世界中的NTP。
底线:由于revertToNitz()
您可以将时间设置为由运营商提供的值。 不幸的是,我还没有find一个机制来获得networking时间。 如果你真的需要这样做,恐怕你必须复制这些ServiceStateTracker
的实现,捕获框架引发的意图(我想),并添加一个getter到mSavedTime
。
从http://commons.apache.org/net/download_net.cgi获取图书馆;
//NTP server list: http://tf.nist.gov/tf-cgi/servers.cgi public static final String TIME_SERVER = "time-a.nist.gov"; public static long getCurrentNetworkTime() { NTPUDPClient timeClient = new NTPUDPClient(); InetAddress inetAddress = InetAddress.getByName(TIME_SERVER); TimeInfo timeInfo = timeClient.getTime(inetAddress); //long returnTime = timeInfo.getReturnTime(); //local device time long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime(); //server time Date time = new Date(returnTime); Log.d(TAG, "Time from " + TIME_SERVER + ": " + time); return returnTime; }
getReturnTime()与System.currentTimeMillis()相同。
应该使用getReceiveTimeStamp()或getTransmitTimeStamp()方法。
将系统时间设置为1小时后,可以看到差异。
local time : System.currentTimeMillis() timeInfo.getReturnTime() timeInfo.getMessage().getOriginateTimeStamp().getTime() NTP server time : timeInfo.getMessage().getReceiveTimeStamp().getTime() timeInfo.getMessage().getTransmitTimeStamp().getTime()
试试这段代码:
String timeSettings = android.provider.Settings.System.getString( this.getContentResolver(), android.provider.Settings.System.AUTO_TIME); if (timeSettings.contentEquals("0")) { android.provider.Settings.System.putString( this.getContentResolver(), android.provider.Settings.System.AUTO_TIME, "1"); } Date now = new Date(System.currentTimeMillis()); Log.d("Date", now.toString());
确保在Manifest中添加权限
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
这似乎适用于我:
LocationManager locMan = (LocationManager) activity.getSystemService(activity.LOCATION_SERVICE); long networkTS = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getTime();
使用Android 2.2 API(8级)
NITZ是一种NTPforms,通过第3层或NAS层发送到移动设备。 通常这条信息被视为GMM信息,包含以下信息:
某些运营商不支持这一点,有些支持它,并设置不正确。
第3层信令消息
时间:9:38:49.800
GMM信息3GPP TS 24.008 ver 12.12.0 Rel 12(9.4.19)
M Protocol Discriminator(hex数据:8)
(0x8) Mobility Management message for GPRS services
M跳跃指示器(hex数据:0)值:0 M消息types(hex数据:21)消息编号:33
Onetworking时区(hex数据:4680)时区值:GMT + 2:00 O世界时间和时区(hex数据:47716070 70831580)年份:17月份:06date:07时:07分38秒:51时区值:GMT + 2:00 Onetworking夏令时(hex数据:490100)夏令时值:无调整
第3层数据:08 21 46 80 47 71 60 70 70 83 15 80 49 01 00
时间信号没有内置到networking天线中:您必须使用NTP协议才能在ntp服务器上检索时间。 有大量的ntp客户端,可作为独立的可执行文件或库。
GPS信号确实包括一个精确的时间信号,可以用任何“修复”。
然而,如果也没有networking,也没有可用的GPS,你唯一的select就是在手机上的时间…你最好的解决scheme是使用系统范围设置自动同步手机时间到GPS或ntp时间,然后总是使用手机的时间。
请注意,电话时间,如果定期同步,应该不会有太多的GPS或NTT时间。 还要注意强制用户同步时间可能是侵入性的,你最好问你的用户是否接受同步。 最后,你确定你绝对需要一个精确的时间吗?