以编程方式获取网络运营商的时间(android)

Posted

技术标签:

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

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

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

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

我也做了google search:

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

编辑:

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

谢谢。

【问题讨论】:

现在是 2019 年,但我仍然没有得到答案! :( 【参考方案1】:

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

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

这两个操作都需要系统级权限。也就是说,您的应用需要使用系统密钥(即由 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()的实际时间

以上是关于以编程方式获取网络运营商的时间(android)的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 Android(KitKat 及更高版本)中添加 APN

如何以编程方式获取android手机的IP地址......? [复制]

Android:获取附近的所有蜂窝运营商及其信号强度

如何在 Android 上以编程方式从 Mac 地址获取 IP 地址?

如何以编程方式通过 Wifi 获取连接在同一网络上的其他设备的 IP 地址?

以编程方式将设备连接到android中的同一wifi网络?