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

以编程方式获取网络运营商';s时间(android),android,datetime,Android,Datetime,我需要获取我的android应用程序的当前时间。时间应该是操作员的时间,而不是用户设置的本地时间 TelephonyManager telephonyManager =((TelephonyManager)Context.getSystemService(Context.TELEPHONY_SERVICE)); String operatorName = telephonyManager.getNetworkOperatorName(); 这是以编程方式获取运算符的名称。但如何获取操作员的当前

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

TelephonyManager telephonyManager =((TelephonyManager)Context.getSystemService(Context.TELEPHONY_SERVICE));
String operatorName = telephonyManager.getNetworkOperatorName();
这是以编程方式获取运算符的名称。但如何获取操作员的当前时间?如果用户手动更改了时间,则应用程序会将其更改为操作员的当前时间

我也做了一件事:

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

编辑:

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


谢谢。

简单的答案是这件事做不到。为了实现您的目标,您的应用程序需要做两件事:

  • 向网络运营商发送服务信息;及
  • 更改设备上的本地时间
  • 这两种操作都需要系统级权限。也就是说,您的应用程序需要使用系统密钥(即谷歌向设备制造商发布的密钥)进行签名才能访问这些功能

    您可以从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服务器的实时时间,而不是来自设备的时间。但是,您将无法将时间设置为设备的当前时间。

    它需要internet连接吗?我忘了提到它是一个离线应用程序,不需要访问互联网许可。是的,这需要互联网连接。如果其中一个不可用,则您将无法获取除本地设备上的时间以外的其他时间。我认为您需要从地址中删除“服务器”位,然后使用
    timeInfo.getMessage().getTransmitTimeStamp().getTime()
    获取实际时间,现在是2019年,但我仍然没有得到答案!:(