2013-08-19 91 views
9

我需要獲取我的android應用程序的當前時間。時間應該是運營商的時間,而不是用戶設置的本地時間。以編程方式獲取網絡運營商的時間(android)

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

這是以編程方式獲取運算符的名稱。但如何獲得運營商目前的時間?如果用戶手動更改了時間,則應用程序會將其更改爲運營商的當前時間。

我做了google search太:

無法找到一個更好的。如果它已經在stackoverflow上提出了請求,請提供鏈接。

編輯:

我忘了提,這就是我沒有得到來自用戶的上網權限的離線應用程序。

謝謝。

回答

5

簡單的答案是它不能完成。爲了完成你想要的任務,你的應用需要做兩件事:

  1. 發送服務消息給網絡運營商;和
  2. 更改設備上的當地時間。

這兩個操作都需要系統級權限。也就是說,您的應用需要使用系統密鑰(即Google向設備製造商發佈的密鑰)進行簽名才能訪問這些功能。

可以做的是從NTP服務器獲取當前時間。互聯網上有許多免費使用的NTP服務器。樣本代碼來獲得這樣的時間是這樣的:

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

現在你cal對象包含從NTP服務器,而不是從設備時真正時間。但是,您將無法將時間設置爲設備的當前時間。

+0

是否需要互聯網連接?我忘了提及它是一個不需要訪問互聯網許可的離線應用程序。 –

+1

是的,這將需要互聯網連接。如果其中一個不可用,那麼您將無法獲得本地設備以外的時間。 –

+0

我想你需要從地址中刪除「服務器」位,然後用'timeInfo.getMessage()。getTransmitTimeStamp()。getTime()'獲得實際的時間。 – lane

相關問題