Ich möchte in meiner Bewerbung einen Weg finden, Datum und Uhrzeit mit einer externen Quelle zu synchronisieren.
Ich möchte die Telefonzeit nicht nutzen, da ich in Echtzeit möglicherweise einen Unterschied von 5 Minuten habe. und 5 Minuten mehr oder weniger = 10 Minuten!
Ich habe von Zeitinformationen bei den GPS-Satelliten oder bei Netzwerkantennen gehört.
Ich habe es mit System.getCurrentTime ausprobiert, aber ich bekomme den aktuellen Strom des Geräts. Wenn mein Gerät 5 Minuten früher eingerichtet ist, wird die falsche Uhrzeit angezeigt.
EDIT
Um eine kurze Frage zu stellen: Wie bekomme ich diese Zeit?
Ich wusste es nicht, fand die Frage aber interessant. Also habe ich in den Android-Code gegraben ... Danke Open-Source :)
Der Bildschirm, den Sie anzeigen, ist DateTimeSettings
. Das Kontrollkästchen "Vom Netzwerk bereitgestellte Werte verwenden" ist der gemeinsamen Einstellung String KEY_AUTO_TIME = "auto_time";
und auch Settings.System.AUTO_TIME
zugeordnet.
Diese Einstellung wird von einem beobachteten Namen mAutoTimeObserver
im 2 Netzwerk ServiceStateTracker
s: GsmServiceStateTracker
und CdmaServiceStateTracker
beobachtet.
Beide Implementierungen rufen eine Methode mit dem Namen revertToNitz()
auf, wenn die Einstellungen wahr werden . Scheinbar ist NITZ das Äquivalent von NTP in der Carrier-Welt.
Fazit: Sie können die Uhrzeit dank revertToNitz()
..__ auf den Wert des Betreibers einstellen. Leider habe ich keinen Mechanismus gefunden, um die Netzwerkzeit zu ermitteln. Wenn Sie dies wirklich tun müssen, müssen Sie leider diese ServiceStateTracker
s-Implementierungen kopieren, die Absicht des Frameworks (nehme ich an) abfangen und mSavedTime
einen Getter hinzufügen.
Laden Sie die Bibliothek von http://commons.Apache.org/net/download_net.cgi herunter.
//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 () ist identisch mit System.currentTimeMillis ().
die Methode getReceiveTimeStamp () oder getTransmitTimeStamp () sollte verwendet werden.
Sie können den Unterschied sehen, nachdem Sie die Systemzeit auf 1 Stunde eingestellt haben.
local time :
System.currentTimeMillis()
timeInfo.getReturnTime()
timeInfo.getMessage().getOriginateTimeStamp().getTime()
NTP server time :
timeInfo.getMessage().getReceiveTimeStamp().getTime()
timeInfo.getMessage().getTransmitTimeStamp().getTime()
Probieren Sie dieses Codefragment aus:
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());
Stellen Sie sicher, dass Sie die Berechtigung in Manifest hinzufügen
<uses-permission Android:name="Android.permission.WRITE_SETTINGS"/>
Das schien für mich zu funktionieren:
LocationManager locMan = (LocationManager) activity.getSystemService(activity.LOCATION_SERVICE);
long networkTS = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getTime();
Arbeiten an der Android 2.2-API (Stufe 8)
NITZ ist eine Form von NTP und wird über Layer 3 oder NAS an das mobile Gerät gesendet. Normalerweise wird diese Nachricht als GMM-Info angesehen und enthält folgende Informationen:
Einige Netzbetreiber unterstützen dies nicht, andere unterstützen es und lassen es falsch einrichten.
SCHICHT 3 SIGNALMELDUNG
Zeit: 9: 38: 49,800
GMM INFORMATION 3GPP TS 24.008 ver 12.12.0 Rel 12 (9.4.19)
M-Protokolldiskriminator (Hex-Daten: 8)
(0x8) Mobility Management message for GPRS services
M Sprunganzeige (Hex-Daten: 0) Wert: 0 M Nachrichtentyp (Hex-Daten: 21) Nachrichtennummer: 33
O Netzwerkzeitzone (Hex-Daten: 4680) Zeitzonenwert: GMT + 2: 00 O Universalzeit und Zeitzone (Hex-Daten: 47716070 70831580) Jahr: 17 Monat: 06 Tag: 07 Stunde: 07 Minute: 38 Zweitens: 51 Zeitzonenwert: GMT + 2: 00 O Sommerzeit für das Netzwerk (Hex-Daten: 490100) Sommerzeitwert: Keine Anpassung
Daten der Schicht 3: 08 21 46 80 47 71 60 70 70 83 15 80 49 01 00
Jetzt können Sie Zeit für den aktuellen Standort erhalten, aber dafür müssen Sie die permanente Standardzeitzone des Systems festlegen .setTimeZone(String timeZone)
, die Sie abrufen können
Calendar calendar = Calendar.getInstance();
long now = calendar.getTimeInMillis();
TimeZone current = calendar.getTimeZone();
setAutoTimeEnabled(boolean enabled)
Legt fest, ob die Uhrzeit der Wanduhr mit automatischen Zeitaktualisierungen von NTP synchronisiert werden soll.
TimeManager timeManager = TimeManager.getInstance();
// Use 24-hour time
timeManager.setTimeFormat(TimeManager.FORMAT_24);
// Set clock time to noon
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR_OF_DAY, 12);
long timeStamp = calendar.getTimeInMillis();
timeManager.setTime(timeStamp);
Ich habe nach dieser Art von Antwort gesucht, die ich gelesen habe, aber ich bin nicht zufrieden und es war ein bisschen alt. Ich habe die neue Lösung gefunden und sie geteilt. :)
Weitere Informationen finden Sie unter: https://developer.Android.com/things/reference/com/google/Android/things/device/TimeManager.html