在通过android平台通过api Settings相关的接口设置时间的自动同步处理后,device上的时间并没有与网络上的某个服务器进行时间的同步处理。这个使用已插入有效sim卡wcdma网络可以用的samsung i9000就可以验证出来。但是对于htc saga device,如果是自定的程序通过Settings去设置,时间同步是失效的,而通过device中的setting功能设置,时间同步有效。仔细查看系统的log信息可以发现,device的setting在设置时间的自动同步标志值后会发送一个action为com.htc.app.autosetting.location的broadcast,通过component com.htc.htclocationservice/.AutoSettingReceiver进行处理。处理的流程未进行跟踪:(
查询了相关资料,发现后续文章的内容帮助解答了一些疑惑。(此文仅用于备忘)
后续文章内容是基于http://blog.csdn.net/absurd/archive/2011/01/09/6125588.aspx的一个整理
Android的网络时间同步与SNTP协议无关,甚至与TCP/IP协议也毫无关系。
从设置的应用程序中可以了解到,自动同步网络时间的选项只是修改了Settings.System.AUTO_TIME这个设置:
private void setAutoState(boolean isEnabled, boolean autotimeStatus) { if (isEnabled == false) { mAutoPref.setChecked(autotimeStatus); mAutoPref.setEnabled(isEnabled); } else { Settings.System.putInt(getContentResolver(), Settings.System.AUTO_TIME, autotimeStatus ? 1 : 0); } mTimePref.setEnabled(!autotimeStatus); mDatePref.setEnabled(!autotimeStatus); mTimeZone.setEnabled(!autotimeStatus); }
从代码中查找Settings.System.AUTO_TIME,主要有下面两处:
telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
GSM和CDMA的实现是类似的,这里只是看看GSM:
1. reference-ril/reference-ril.c处理主动上报消息。
if (strStartsWith(s, "%CTZV:")) { /* TI specific -- NITZ time */ char *response; line = p = strdup(s); at_tok_start(&p); err = at_tok_nextstr(&p, &response); free(line); if (err != 0) { LOGE("invalid NITZ line %s\n", s); } else { RIL_onUnsolicitedResponse ( RIL_UNSOL_NITZ_TIME_RECEIVED, response, strlen(response)); } }
这里是处理模组主动上报的消息,如果是时间和时区消息,则调用RIL_onUnsolicitedResponse。
2. RIL_onUnsolicitedResponse会把消息发送给RIL的客户端。
ret = sendResponse(p, client_id);
时间和时区信息的格式在RIL_UNSOL_NITZ_TIME_RECEIVED消息的定义处有说明:"data" is const char * pointing to NITZ time string in the form "yy/mm/dd,hh:mm:ss(+/-)tz,dt"
3. RIL客户端处理RIL_UNSOL_NITZ_TIME_RECEIVED消息(telephony/java/com/android/internal/telephony/RIL.java: processUnsolicited)
case RIL_UNSOL_NITZ_TIME_RECEIVED: if (RILJ_LOGD) unsljLogRet(response, ret); // has bonus long containing milliseconds since boot that the NITZ // time was received long nitzReceiveTime = p.readLong(); Object[] result = new Object[2]; result[0] = ret; result[1] = Long.valueOf(nitzReceiveTime); if (mNITZTimeRegistrant != null) { mNITZTimeRegistrant .notifyRegistrant(new AsyncResult (null, result, null)); } else { // in case NITZ time registrant isnt registered yet mLastNITZTimeInfo = result; }
是GsmServiceStateTracker向RIL注册的,所以事件会由GsmServiceStateTracker来处理。
4. GsmServiceStateTracker 处理EVENT_NITZ_TIME事件:
case EVENT_NITZ_TIME: ar = (AsyncResult) msg.obj; String nitzString = (String)((Object[])ar.result)[0]; long nitzReceiveTime = ((Long)((Object[])ar.result)[1]).longValue(); setTimeFromNITZString(nitzString, nitzReceiveTime); break;
这里nitzString是时间字符串,由setTimeFromNITZString负责解析。
private void setTimeFromNITZString (String nitz, long nitzReceiveTime) { String[] nitzSubs = nitz.split("[/:,+-]"); int year = 2000 + Integer.parseInt(nitzSubs[0]); c.set(Calendar.YEAR, year); // month is 0 based! int month = Integer.parseInt(nitzSubs[1]) - 1; c.set(Calendar.MONTH, month); int date = Integer.parseInt(nitzSubs[2]); c.set(Calendar.DATE, date); int hour = Integer.parseInt(nitzSubs[3]); c.set(Calendar.HOUR, hour); int minute = Integer.parseInt(nitzSubs[4]); c.set(Calendar.MINUTE, minute);
如果在系统设置中,用户选择了自动同步网络时间,才会去设置系统时间。
if (getAutoTime()) { setAndBroadcastNetworkSetTimeZone(zone.getID()); } if (getAutoTime()) { setAndBroadcastNetworkSetTime(c.getTimeInMillis()); }
关于NITZ在WIKI上有说明,可以参见:http://en.wikipedia.org/wiki/NITZ:
NITZ, or Network Identity and Time Zone[1], is a mechanism for provisioning local time and date, as well as network provider identity information to mobile devices via a wireless network[2]. NITZ has been part of the official GSM standard since phase 2+ release 96[3]. NITZ is often used to automatically update the system clock of mobile phones.
由于NITZ的实现是可选的,如果运营商不支持它,Android手机就无法使用此功能了。此时用最好用SNTP来代替,否则用户会感到迷惑。但Android目前好像并没有这样做,我只找到两处地方调用SntpClient,但它们都没有去设置系统时间。
相关推荐
在Android系统中,时间同步服务是一项至关重要的功能,它确保设备的时间与互联网上的标准时间保持一致,从而保证各种应用程序的正常运行,如日程管理、网络通信等。本压缩包中的"syncClockService"可能包含了实现这...
随着全球信息化和通络通讯技术的迅速发展,人们对时间的精准性要求越来越高。本文通过对NTP 网络时间同步协议和原理的研究,分析了时间同步的架构与流程,提出了NTP 网络时间同步在Android 平台的实现方案。
在Android系统中,时间同步是一项重要的功能,确保设备时间的准确性和一致性。通常,Android设备会通过NITZ(Network Identity and Time Zone)服务来自动同步时间,这依赖于移动网络运营商提供的时间信息。NITZ...
1. **系统时间同步**:Android系统以往已有与网络时间服务器同步时间的功能,如NTP(Network Time Protocol)。但在Android 9.0中,可能进一步强化了这一功能,提供了更便捷的API接口,允许应用程序或系统服务直接...
在Android平台上开发一款网络音乐播放应用,实现歌词同步功能,是一项技术挑战但也充满乐趣。这里我们探讨的关键知识点包括Android应用程序开发、网络数据获取、JSON解析、音频播放以及歌词同步技术。 首先,...
在IT行业中,时间同步是一项至关重要的任务,尤其是在网络通信、数据记录和系统管理等领域。"NTP内网时间同步"的标题和描述指向了一个具体的解决方案,即使用Network Time Protocol(NTP)在局域网(内网)环境中...
在Android应用开发中,获取网络时间是一项常见的需求,主要用于确保应用程序中的时间信息准确无误,避免用户手动修改设备时间导致的潜在问题。本教程将详细讲解如何在Android中实现网络时间的获取,并提供相关的代码...
主要介绍了Android中实现用命令行同步网络时间,本文讲解使用BusyBox实现同步网络时间,并给出了详细操作步骤,需要的朋友可以参考下
安卓手机自带同步时间,Android NTP获取时间 网络时间同步Android 获取时间demo包含apk 和里面的代码本文 不是系统ntp获取时间代码,不过是有借鉴系统ntp service代码开发的demo
在Android平台上,获取网络时间并校准系统时间是一项常见的任务,尤其对于那些需要精确时间同步的应用来说至关重要。本文将深入探讨如何实现这一功能,并提供相关的编程知识点。 首先,要获取网络时间,通常我们会...
总结,NTP时间同步在Android系统中扮演着不可或缺的角色,它确保了设备时间的准确性,从而支持了众多功能的正常运行。理解和掌握NTP的工作原理以及如何在Android环境中实现它是每个Android开发者必备的知识点。
1. **时间同步**:所有设备需要有一个共同的时间基准,可以使用NTP(Network Time Protocol)服务或者在启动时同步一个参考时间。 2. **数据同步**:确保每个设备在同一时间点播放相同的数据帧。发送端需要按照特定...
网络时间同步是通过NTP协议实现的,它允许计算机与远程服务器校准时间,以确保精确性。NTP服务器通常是一组全球分布的高精度原子钟,它们之间相互校对,提供统一的时间标准。客户端计算机通过发送请求到这些服务器,...
最近整理出android-获取网络时间、获取特定时区时间、时间同步的方法。具体如下: 方法一: SimpleDateFormat dff = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); dff.setTimeZone(TimeZone.getTimeZone(GMT+08)); ...
在Android应用开发中,"修改头像并同步服务器"是一个常见的功能需求,用户可以自定义他们的个人形象,而这些更改需要实时同步到云端服务器,以便其他设备或服务能够获取最新的头像信息。以下是对这个功能的详细解释...
在Android平台上进行网络操作是应用程序开发中的重要环节,它允许应用与远程服务器进行数据交互,如获取用户信息、上传下载文件、同步数据等。本文将深入探讨“Android网络操作”的核心概念、常用方法以及如何利用...
"同步系统时间功能实现"这个主题聚焦于如何在Android平台上获取网络时间并更新本地系统时间,以确保时间的一致性和准确性。以下是对这个功能的详细阐述: 1. **NTP协议**:网络时间协议(Network Time Protocol, ...
首先明确目标:在Android应用中实现网络时间的获取功能。这通常涉及到以下几个步骤: 1. **建立网络连接**:访问提供时间服务的服务器。 2. **发送请求**:向服务器发送获取时间的请求。 3. **接收响应**:从服务器...
【Android代码-开源文件同步安卓版】是一款专为Android设备设计的开源文件同步应用,它允许用户在不同的设备之间安全地、实时地同步和共享文件。这个项目基于Syncthing,一个跨平台的、自由开源的文件同步工具,旨在...
在Android网络编程中,还需要注意以下几点: 1. **权限声明**:确保在AndroidManifest.xml中添加了`INTERNET`权限,否则应用无法进行网络访问。 2. **网络连接检测**:在发起请求前,检查设备是否已连接到网络,避免...