【问题标题】:Programmatically get the network operator's time (android)以编程方式获取网络运营商的时间(android)
【发布时间】:2013-08-21 04:44:39
【问题描述】:

我需要获取我的 android 应用程序的当前时间。时间应该是运营商的时间,而不是用户设置的本地时间。

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

这是以编程方式获取操作员的名称。但是如何获取运营商的当前时间呢?如果用户手动更改了时间,则应用程序会将其更改为操作员的当前时间。

我也做了google search

找不到更好的。如果它已经在 stackoverflow 上询问过,请原谅并提供链接。

编辑:

我忘了提到它是一个离线应用程序,我没有从用户那里获得互联网许可。

谢谢。

【问题讨论】:

  • 现在是 2019 年,但我仍然没有得到答案! :(

标签: android datetime


【解决方案1】:

简单的答案是无法做到。为了完成你想要的,你的应用需要做两件事:

  1. 向网络运营商发送服务消息;和
  2. 更改设备上的本地时间。

这两个操作都需要系统级权限。也就是说,您的应用需要使用系统密钥(即由 Google 颁发给设备制造商的密钥)进行签名才能访问这些功能。

可以做的是从 NTP 服务器获取当前时间。互联网上有很多免费使用的 NTP 服务器。获得这样时间的示例代码是这样的:

String timeServer = "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 服务器的实际时间,而不是来自设备的时间。不过,您将无法将时间设置为设备的当前时间。

【讨论】:

  • 是否需要互联网连接?我忘了提到它是一个离线应用程序,不需要访问互联网权限。
  • 是的,这需要互联网连接。如果一个不可用,那么您将无法获得除本地设备上的时间之外的时间。
  • 我认为您需要从地址中删除“服务器”位,然后您将获得timeInfo.getMessage().getTransmitTimeStamp().getTime()的实际时间
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多