前言

在开发过程中我们常常需要获取系统时间。
Android系统的自动确认时间,是由系统通过访问厂家的NTP服务器的时间,然后修改后得到的。
所以当没有网络或者在内网环境下的时候,系统无法访问到NTP服务器,便会造成系统时间错误。
所以这个时候我们就需要程序去修改系统的时间,或者获取一个正确的时间来代替系统时间。

NTP服务器

【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。时间按NTP服务器的等级传播。按照离外部UTC源的远近把所有服务器归入不同的Stratum(层)中。

解决方案

根据不同的情况,我实现了如下三种解决方案:

  1. 修改系统时间。
    优点:程序启动时执行一次即可,一劳永逸。
    缺点:只能在原生系统中使用,非原生系统无法安装。(具体后面会解释)。

  2. 获取NTP服务器时间代替系统时间。
    优点:无需Root,适用于任何手机及系统。
    缺点:需要可以访问外部网络,内网环境下则需要一台自己的NTP服务器。

  3. 获取网页时间代替系统时间。
    优点:无需Root,适用于任何手机及系统,适用于任何网络环境。
    缺点:需要一条额外的线程,去维护时间准确,容易造成误差。

代码及目录

GitHub: https://blog.csdn.net/DeMonliuhui/article/details/82226601

1.修改系统时间

1.配置系统JDK环境变量

这个就不细说了,自行百度。
由于签名工具用到的sun.misc.BASE64Encoder类已从Java SE 9中删除。所以只能在Java 1.8及以下环境下使用。
具体可以查看:JDK从1.8升级到9.0.1后sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用

2.修改系统时间,一行代码如下:

SystemClock.setCurrentTimeMillis(long millis);

3.修改AndroidManifest.xml

在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId=”android.uid.system”这个属性。
添加该属性后,由于权限冲突,程序无法直接安装,必须重新签名。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.demon.setsystemtime"android:sharedUserId="android.uid.system"  >
</manifest>

4.编译apk,重新签名

Android Studio编译生成apk,然后将apk复制到上述目录的sign文件夹(重新签名的文件夹)下,将apk的名字与bat脚本中的一致。
用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。
双击运行bat脚本,脚本代码如下:

@echo off
java -jar signapk.jar platform.x509.pem platform.pk8 demo.apk test.apk
pause

signapk.jar: Android提供的签名工具。
platform.x509.pem&platform.pk8: Android源码目录中"build/target/product/security",下面的两个文件。
demo.apk:程序编译生成的apk。
test.apk:重新签名后的apk。

这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。

安装重新签名的apk,运行即可修改系统时间。

获取NTP服务器时间代替系统时间

直接使用truetime-android框架即可同步NTP服务器时间,调取框架内的方法便可以实时获取最新时间。
GitHub:https://github.com/instacart/truetime-android
具体的使用可以参考代码,或者GitHub文档。

### 阿里云提供了7个NTP服务器
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com### 中国科学技术大学NTP服务器
time.ustc.edu.cn

获取网页时间代替系统时间

根据下列代码,我们就可以获取任何一个网址的时间(内网服务器地址)。
拿到这个时间后,可以开启一个线程,做定时任务,不断更新该时间,以到达时间时间同步的效果。
具体实现方法不再阐述。

/*** 网址访问* @param url  网址* @return urlDate 对象网址时间*/public static String VisitURL(String url){String urlDate = null;try {URL url1 = new URL(url);URLConnection  conn = url1.openConnection();  //生成连接对象conn.connect();  //连接对象网页Date date = new Date(conn.getDate());  //获取对象网址时间SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  //设置日期格式urlDate = df.format(date);} catch (Exception e) {e.printStackTrace();}return urlDate;}

效果

参考

http://www.programgo.com/article/54422482620/

Android 校正系统时间的三种解决方案相关推荐

  1. java 当前时间string_Java 获取当前系统时间的三种方法

    准备工作: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; 方式一: /** ...

  2. web java获取当前时间_Java 获取当前系统时间的三种方法

    准备工作: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; 方式一: /** ...

  3. 让 Android WebView 支持文件下载的三种解决方案

    最近在开发的过程中遇到一个需求,那就是让 WebView 支持文件下载,比如说下载 apk.WebView 默认是不支持下载的,需要开发者自己实现.既然 PM 提出了需求,那咱就撸起袖子干呗,于是乎在 ...

  4. 获取当前系统时间(三种方法)

    #include<time.h> #include<stdio.h> void main() { /*方法1 time_t curTime = time(NULL); char ...

  5. Java 获取系统时间的三种方式,总结起来

    业务场景中,不乏会需要取到当前系统的时间,做一些判断,比如判断某个执行过程需要花多长时间,然后将时间记录下来,返回给业务查看:或者需要或者一个唯一的值做一些表单单号,那么当前系统时间就是唯一的,可以适 ...

  6. java获取系统时间的几种方法_Java篇—获取当前系统时间的三种方式(超详细+多方法)...

    1.通过util包中的Date类来获取当前时间 方法1详细代码: public class Exercise17 { public static void main(String[] args){ D ...

  7. 计算机不识别lacie硬盘,windows10系统下移动硬盘读不出来的三种解决方案

    移动硬盘即是便携性的存储产品,其具有超大的空间,我们可以将资料很好地保存进去.不过,一些windows10系统用户发现将移动硬盘的USB插上计算机后,会遇到"无法识别USB设备"的 ...

  8. android 使用 系统字体,Android_解析Android中使用自定义字体的实现方法,1、Android系统默认支持三种字 - phpStudy...

    解析Android中使用自定义字体的实现方法 1.Android系统默认支持三种字体,分别为:"sans", "serif", "monospace ...

  9. thinkpad卡在logo界面_由于win7系统启动卡在Thinkpad LOGO屏幕上而导致无法进入系统的三种解决方案...

    最近联想平板卡在主界面,一个Win7 pure版本系统的用户报告说,在打开计算机电源时,发现它卡在了Thinkpad引导LOGO屏幕上,并且无法正常进入系统桌面. win7系统卡在徽标界面上的原因有很 ...

  10. 分布式事务中常见的三种解决方案

    分布式事务中常见的三种解决方案 目录 一.分布式事务前奏 二.柔性事务解决方案架构 (一).基于可靠消息的最终一致性方案概述 (二).TCC事务补偿型方案 (三).最大努力通知型 三.基于可靠消息的最 ...

最新文章

  1. 严查!教育部发文:倒查 5 年博士、硕士学位论文作假行为!
  2. ArcGIS Desktop 10.1安装教程
  3. 解决GeoTools中CQL解析中文字段名的问题
  4. 无所不在的IM,网易云信潜心为移动社交时代打好地基
  5. 批梯度下降 随机梯度下降_梯度下降及其变体快速指南
  6. C++中set按降序排序
  7. 基于centos6.5搭建redis伪分布式主备节点
  8. antd vue form 手动校验_jsonschema-form-vue基于JSONSchema的表单自动生成方案
  9. VIM 查找替换命令的使用
  10. 数据分析项目实战—信用卡客户违约概率预测
  11. 如何写好科研论文思维导图分享
  12. 计算机网络布线总结,网络综合布线实训总结
  13. 汉印HPRT HY80BT 打印机驱动
  14. 无线共享打印机无法连接服务器,“不能连接网络共享打印机”常见原因及处理方法:...
  15. oracle存储过程无效字符_ORA-20003 , procedure存储过程失效问题
  16. 两个人聪明人的空城——《司马懿之虎啸龙吟》
  17. 70万行代码、历时20年,一名开发人员写出的史诗般的计算机程序
  18. 【鸿蒙】HiSpark Wifi IOT开发板资料汇总
  19. 知识体系更新迭代的探索
  20. 第 3-7 课:延伸——Flutter Android Studio 开发环境的搭建

热门文章

  1. 耐得寂寞,拥得繁华 (转)
  2. winform 打印快递电子面单_c#对接电子面单打印平台
  3. win10安装打印机操作无法完成0x0000007e找不到指定模块
  4. 【VMWare通过vmdk文件创建虚拟机】
  5. OSChina 周三乱弹 ——程序员是将咖啡转变成代码的工具
  6. 自己动手制造超强硬件防火墙
  7. RealSense 图形识别之路 1.0
  8. 谷歌神经网络机器翻译NMT:人人可利用TensorFlow快速建立翻译模型
  9. 可编程器件的编程原理
  10. 编程中的快速数学公式 python