How can I get the "network" time, (from the "Automatic" setting called "Use network-provided values"), NOT the time on the phone?
I didn't know, but found the question interesting. So I dug in the android code... Thanks open-source :)
The screen you show is DateTimeSettings
. The checkbox "Use network-provided values" is associated to the shared preference String KEY_AUTO_TIME = "auto_time";
and also to Settings.System.AUTO_TIME
This settings is observed by an observed called mAutoTimeObserver
in the 2 network ServiceStateTracker
s: GsmServiceStateTracker
and CdmaServiceStateTracker
.
Both implementations call a method called revertToNitz()
when the settings becomes true.Apparently NITZ is the equivalent of NTP in the carrier world.
Bottom line: You can set the time to the value provided by the carrier thanks to revertToNitz()
.Unfortunately, I haven't found a mechanism to get the network time. If you really need to do this, I'm afraid, you'll have to copy these ServiceStateTracker
s implementations, catch the intent raised by the framework (I suppose), and add a getter to mSavedTime
.
Get the library from http://commons.apache.org/net/download_net.cgi
//NTP server list: http://tf.nist.gov/tf-cgi/servers.cgipublic 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() is same as System.currentTimeMillis().
getReceiveTimeStamp() or getTransmitTimeStamp() method should be used.
You can see the difference after setting system time to 1 hour ago.
local time :System.currentTimeMillis()timeInfo.getReturnTime()timeInfo.getMessage().getOriginateTimeStamp().getTime()NTP server time :timeInfo.getMessage().getReceiveTimeStamp().getTime()timeInfo.getMessage().getTransmitTimeStamp().getTime()
Try this snippet of code:
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());
Make sure to add permission in Manifest
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>