2013-08-19 12 views
9

Potrzebuję uzyskać bieżący czas dla mojej aplikacji na Androida. Czas powinien być czasem operatora, a nie czasem lokalnym ustalonym przez użytkownika.Programowo uzyskaj czas operatora sieci (Android)

TelephonyManager telephonyManager =((TelephonyManager)Context.getSystemService(Context.TELEPHONY_SERVICE)); 
String operatorName = telephonyManager.getNetworkOperatorName(); 

Ma to na celu programowe podanie nazwy operatora. Ale jak uzyskać aktualny czas operatora? Jeśli użytkownik ręcznie zmienił czas, aplikacja zmieni go na bieżący czas.

Zrobiłem google search też:

Nie można znaleźć lepszego. Jeśli jest już zadany na stackoverflow, przepraszam i proszę podać link.

EDIT:

Zapomniałem wspomnieć, że jest nieaktywny app gdzie nie jestem uzyskanie zgody od użytkownika Internetu.

Dzięki.

Odpowiedz

5

Prosta odpowiedź brzmi, że nie można tego zrobić. Aby osiągnąć to, czego potrzebujesz, Twoja aplikacja musiałaby zrobić dwie rzeczy:

  1. wysłać wiadomość serwisową do operatora sieci; i
  2. zmienić czas lokalny na urządzeniu.

Obie te operacje wymagają uprawnień na poziomie systemu. Oznacza to, że Twoja aplikacja musi być podpisana za pomocą klucza systemowego (tj. Jednego wydanego przez Google producentom urządzeń) w celu uzyskania dostępu do tych funkcji.

Co można zrobić można zrobić to aktualny czas z serwera NTP. W internecie jest wiele darmowych serwerów NTP. Próbkę kodu, aby uzyskać taki czas jest taka:

String timeServer = "server 0.pool.ntp.org"; 

NTPUDPClient timeClient = new NTPUDPClient(); 
InetAddress inetAddress = InetAddress.getByName(timeServer); 
TimeInfo timeInfo = timeClient.getTime(inetAddress); 
long returnTime = timeInfo.getReturnTime(); 

Calendar cal = Calendar.getInstance(); 
cal.setTimeInMillis(returnTime); 

Teraz Twój obiekt cal zawiera prawdziwe czasu z serwerem NTP, a nie czasu z urządzenia. Nadal nie będziesz w stanie ustawić czasu jako aktualnego czasu urządzenia.

+0

Czy wymaga połączenia z Internetem? Zapomniałem wspomnieć, że jest to aplikacja offline, w której nie jest wymagane uzyskanie dostępu do Internetu. –

+1

Tak, będzie to wymagało połączenia z Internetem. Jeśli nie jest dostępny, nie będzie można uzyskać czasu innego niż na lokalnym urządzeniu. –

+0

Myślę, że musisz usunąć bit "serwera" z adresu, a otrzymasz aktualny czas z 'timeInfo.getMessage(). GetTransmitTimeStamp(). GetTime()' – lane