Comment puis-je obtenir l’heure «réseau» (à partir du paramètre «Automatique» appelé «Utiliser les valeurs fournies par le réseau»), PAS l’heure sur le téléphone?

Je voudrais dans mon application pour trouver un moyen de synchroniser la date et l’heure avec quelque chose donné par une source externe.

Je ne veux pas utiliser le temps de téléphone car je pourrais peut-être faire une différence de 5 minutes en temps réel. et 5 minutes supplémentaires ou moins = 10 minutes!

J’ai entendu parler de l’heure dans les satellites GPS ou dans les antennes réseau.

J’ai essayé avec System.getCurrentTime mais j’obtiens le courant de l’appareil, donc, si mon appareil est configuré 5 minutes plus tôt, il affiche l’heure incorrecte.

MODIFIER

Pour poser une petite question: comment puis-je obtenir ce temps?

entrer la description de l'image ici

Je ne savais pas, mais j’ai trouvé la question intéressante. Donc j’ai creusé dans le code Android … Merci open-source 🙂

L’écran que vous affichez est DateTimeSettings . La case à cocher “Utiliser les valeurs fournies par le réseau” est associée à la préférence partagée Ssortingng KEY_AUTO_TIME = "auto_time"; et aussi à Settings.System.AUTO_TIME

Ce paramètre est observé par un observateur appelé mAutoTimeObserver dans les 2 réseaux ServiceStateTracker : GsmServiceStateTracker et CdmaServiceStateTracker .

Les deux implémentations appellent une méthode appelée revertToNitz() lorsque les parameters deviennent vrais. Apparemment, NITZ est l’équivalent de NTP dans le monde des opérateurs.

Bottom line: Vous pouvez régler l’heure sur la valeur fournie par l’opérateur grâce à revertToNitz() . Malheureusement, je n’ai pas trouvé de mécanisme pour obtenir l’heure du réseau. Si vous avez vraiment besoin de faire cela, je crains que vous deviez copier ces implémentations de ServiceStateTracker , attraper l’intention soulevée par le framework (je suppose) et append un getter à mSavedTime .

Obtenez la bibliothèque à partir de http://commons.apache.org/net/download_net.cgi

 //NTP server list: http://tf.nist.gov/tf-cgi/servers.cgi public static final Ssortingng 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 () est identique à System.currentTimeMillis ().

La méthode getReceiveTimeStamp () ou getTransmitTimeStamp () doit être utilisée.

Vous pouvez voir la différence après avoir réglé le temps système il y a 1 heure.

 local time : System.currentTimeMillis() timeInfo.getReturnTime() timeInfo.getMessage().getOriginateTimeStamp().getTime() NTP server time : timeInfo.getMessage().getReceiveTimeStamp().getTime() timeInfo.getMessage().getTransmitTimeStamp().getTime() 

Essayez cet extrait de code:

 Ssortingng timeSettings = android.provider.Settings.System.getSsortingng( this.getContentResolver(), android.provider.Settings.System.AUTO_TIME); if (timeSettings.contentEquals("0")) { android.provider.Settings.System.putSsortingng( this.getContentResolver(), android.provider.Settings.System.AUTO_TIME, "1"); } Date now = new Date(System.currentTimeMillis()); Log.d("Date", now.toSsortingng()); 

Assurez-vous d’append une autorisation dans Manifest

  

Cela a semblé fonctionner pour moi:

 LocationManager locMan = (LocationManager) activity.getSystemService(activity.LOCATION_SERVICE); long networkTS = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getTime(); 

Travailler sur l’API Android 2.2 (niveau 8)

NITZ est une forme de NTP et est envoyé au périphérique mobile sur des couches de couche 3 ou NAS. Ce message est généralement considéré comme GMM Info et contient les informations suivantes:

Certains opérateurs ne supportent pas cela et certains le supportent et le configurent de manière incorrecte.

MESSAGE DE SIGNALISATION DE LA COUCHE 3

Heure: 9: 38: 49.800

INFORMATIONS GMM 3GPP TS 24.008 ver 12.12.0 Rel 12 (9.4.19)

Discriminateur de protocole M (données hexadécimales: 8)

 (0x8) Mobility Management message for GPRS services 

M Indicateur de saut (données hexadécimales: 0) Valeur: 0 M Type de message (données hexadécimales: 21) Numéro de message: 33

O Fuseau horaire du réseau (données hexadécimales: 4680) Valeur du fuseau horaire: GMT + 2: 00 O Fuseau horaire et temps universel (données hexadécimales: 47716070 70831580) Année: 17 Mois: 06 Jour: 07 Heure: 07 Minute: 38 Seconde: 51 Valeur du fuseau horaire: GMT + 2: 00 O Heure d’été du réseau (données hexadécimales: 490100) Valeur heure d’été: pas d’ajustement

Données de la couche 3: 08 21 46 80 47 71 60 70 70 83 15 80 49 01 00

Vous pouvez maintenant obtenir du temps pour l’emplacement actuel, mais pour cela, vous devez définir le fuseau horaire par défaut du système. setTimeZone(Ssortingng timeZone) qui peut être obtenu à partir de

 Calendar calendar = Calendar.getInstance(); long now = calendar.getTimeInMillis(); TimeZone current = calendar.getTimeZone(); setAutoTimeEnabled(boolean enabled) 

Définit si l’heure de l’horloge murale doit être synchronisée avec les mises à jour automatiques de NTP.

 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); 

Je cherchais ce type de réponse, j’ai lu votre réponse mais je n’ai pas été satisfait et c’était un peu vieux. J’ai trouvé la nouvelle solution et la partage. 🙂

Pour plus d’informations, visitez: https://developer.android.com/things/reference/com/google/android/things/device/TimeManager.html

le signal temporel n’est pas intégré aux antennes réseau: vous devez utiliser le protocole NTP pour récupérer l’heure sur un serveur ntp. Il existe de nombreux clients ntp, disponibles en tant qu’exécutables ou bibliothèques autonomes.

le signal gps inclut en effet un signal de temps précis, disponible avec tout “fix”.

Cependant, si ni le réseau, ni les gps ne sont disponibles, votre seul choix est de recourir à l’heure du téléphone … la meilleure solution serait d’utiliser un paramètre système pour synchroniser automatiquement l’heure du téléphone avec le gps ou le ntp. temps, utilisez toujours l’heure du téléphone.

notez que l’heure du téléphone, si elle est synchronisée régulièrement, ne devrait pas différer beaucoup du temps gps ou ntp. notez également que forcer un utilisateur à synchroniser son heure peut être intrusif, vous feriez mieux de demander à votre utilisateur s’il accepte la synchronisation. enfin, êtes-vous sûr d’avoir absolument besoin d’un temps aussi précis?