2013-08-19 13 views
9

Tôi cần có thời gian hiện tại cho ứng dụng Android của mình. Thời gian phải là thời gian của nhà điều hành chứ không phải giờ địa phương do người dùng đặt.Lập trình có thời gian của nhà khai thác mạng (android)

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

Điều này là để có được tên của nhà điều hành theo chương trình. Nhưng làm thế nào để có được thời gian hiện tại của nhà điều hành? Nếu người dùng đã thay đổi thời gian theo cách thủ công thì ứng dụng sẽ thay đổi thời gian đó thành thời gian hiện tại của nhà điều hành.

Tôi cũng đã thực hiện một google search quá:

Không thể tìm thấy biểu tượng tốt hơn. Nếu nó đã được yêu cầu trên stackoverflow, lý do và xin vui lòng cung cấp liên kết.

EDIT:

Tôi quên đề cập đến ứng dụng ngoại tuyến mà tôi không nhận được sự cho phép internet từ người dùng.

Cảm ơn.

Trả lời

5

Câu trả lời đơn giản là không thể thực hiện được. Để thực hiện những gì bạn muốn, ứng dụng của bạn cần thực hiện hai việc:

  1. gửi tin dịch vụ tới nhà điều hành mạng; và
  2. thay đổi giờ địa phương trên thiết bị.

Cả hai thao tác này đều yêu cầu đặc quyền ở cấp hệ thống. Tức là, ứng dụng của bạn cần phải được ký bằng khóa hệ thống (tức là một ứng dụng do Google cấp cho nhà sản xuất thiết bị) để truy cập các chức năng này.

Điều bạn có thể làm là lấy thời gian hiện tại từ máy chủ NTP. Có rất nhiều máy chủ NTP miễn phí sử dụng trên internet. Một số mẫu mã để có được thời gian như vậy là thế này:

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

Bây giờ đối tượng cal của bạn có chứa thực thời gian từ máy chủ NTP và không phải là lần từ thiết bị. Tuy nhiên, bạn sẽ không thể đặt thời gian làm thời gian hiện tại của thiết bị.

+0

Ứng dụng có yêu cầu kết nối internet không? Tôi quên đề cập rằng đây là một ứng dụng ngoại tuyến khi không được phép truy cập internet. –

+1

Có, điều này sẽ yêu cầu kết nối internet. Nếu không có sẵn, bạn sẽ không thể có thời gian khác với thời gian trên thiết bị cục bộ. –

+0

Tôi nghĩ rằng bạn cần phải loại bỏ bit "máy chủ" từ địa chỉ và bạn nhận được thời gian thực tế với 'timeInfo.getMessage(). GetTransmitTimeStamp(). GetTime()' – lane