web-dev-qa-db-de.com

Wie bekomme ich die "Netzwerk" -Zeit (von der "Automatisch" -Einstellung "Vom Netzwerk bereitgestellten Werte verwenden"), NICHT die Zeit auf dem Telefon?

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?

enter image description here

53
Waza_Be

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 ServiceStateTrackers: 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 ServiceStateTrackers-Implementierungen kopieren, die Absicht des Frameworks (nehme ich an) abfangen und mSavedTime einen Getter hinzufügen.

54
rds

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()
21
pretty angela

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"/>
7

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)

2
Thomas Getzoyan

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 

1
Will Mayo

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

0
badarshahzad