概述
1、System.currentTimeMillis()获取的是系统的时间,可以使用SystemClock.setCurrentTimeMillis(long millis)进行设置。如果使用System.currentTimeMillis()来获取当前时间进行计时,应该考虑监听ACTION_TIME_TICK, ACTION_TIME_CHANGED 和 ACTION_TIMEZONE_CHANGED这些广播ACTION,如果系统时间发生了改变,可以通过监听广播来获取。
2、SystemClock.uptimeMillis()表示系统开机到当前的时间总数,单位是毫秒,但是,当系统进入深度睡眠(CPU休眠、屏幕休眠、设备等待外部输入)时间就会停止,但是不会受到时钟缩放、空闲或者其他节能机制的影响。
3、SystemClock.elapsedRealtime()和SystemClock.elapsedRealtimeNanos()表示系统开机到当前的时间总数。它包括了系统深度睡眠的时间。这个时钟是单调的,它保证一直计时,即使CPU处于省电模式,所以它是推荐使用的时间计时器。
有几种机制,用来控制事件时间:
1、标准函数Thread.sleep(millis)和Object.wait(millis)是一直被使用的。如果这些函数使用SystemClock.uptimeMillis()时钟,如果设备进入休眠状态,那么提醒时间可能会被推迟到设备唤醒。并且这些同步函数可以被Thread.interrupt()打断。
2、SystemClock.sleep(millis)是一个工具函数类似于Thread.sleep(millis),不同的是它忽略了InterruptedException异常,如果你不使用Thread.interrupt()的话,就可以使用这个函数来延迟。
3、Handler可以在一个绝对或者相对的时间里同步的调度Runnable对象,它可以使用SystemClock.uptimeMillis()时钟。
4、AlarmManager可以设置一个定时器事件,当时间到来的时候,不管设备是否处于深度睡眠或者正在运行,事件都会发生。
上面介绍了一些方法,下面给出收集到的修改系统时间的方法:
一.系统命令设置,前提是手机必须获得ROOT权限,root方法网上自查。
(一)adb shell 进入shell 终端界面,查看是否已获得权限
1、先设置系统的时区配置
cat /data/property/persist.sys.timezone //查看当前时区配置文件
setprop persist.sys.timezone GMT //修改属性
2、开始设置修改当前系统时间
date -s "yyyymmdd.[[[hh]mm]ss]" 或System/bin/date -s "yyyymmdd.[[[hh]mm]ss]"
3、查看是否生效
date
(二)用系统命令代码实现修改android系统时间的方法
public void testDate(){
try {
Process process = Runtime.getRuntime().exec("su");
String datetime="20131023.112800"; //测试的设置的时间【时间格式 yyyyMMdd.HHmmss】
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("setprop persist.sys.timezone GMTn");
os.writeBytes("/system/bin/date -s "+datetime+"n");
os.writeBytes("clock -wn");
os.writeBytes("exitn");
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
*****************************************************************************************************************************************************************************************
二.系统API直接设置--SystemClock.setCurrentTimeMillis()
public void changeDate(int year,int month,int day) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month);
calendar.set(Calendar.DAY_OF_MONTH,day);
long when = calendar.getTimeInMillis();
if(when/1000 < Integer.MAX_VALUE){
SystemClock.setCurrentTimeMillis(when);
}
}
然而SystemClock.setCurrentTimeMillis 这个函数需要root 权限或者运行在系统进程中才可以用
获得权限的网上的方法(个人表示怀疑,没弄出来):
第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:
1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。
第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:
1. 同上,加入android:sharedUserId="android.uid.system"这个属性。
2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。
3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。
4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build/target/product/security",下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build/tools/signapk"下,用法为"
signapk platform.x509.pem platform.pk8 input.apk output.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。
这样最后得到的apk和第一个方法是一样的。
最后解释一下原理,首先加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。
只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。
这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package ... has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。
最最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。
第二个方法详细版:
先进入 Android 源码目录 F:android_sourcebuildtargetproductsecurity ,具体机器目录自己选择。找到 【platform.pk8】和【platform.x509.pem】这两个文件,这里为了方便将它们复制到根目录,如:F:sign 文件夹内,本来下一步就是需要打包jar 包了,不过里我们在android系统的源码内找到 out 编绎目录下
signApk.jar 这个包,可以自行打jar 包或者下载我这个jar 包都是可以的,下载地址:signapk 请自行将后缀名改为.jar 格式,把此jar 包放于F:sign 文件内,打开dos 操作界面,定们到F:sign,如下:,接着输入如下命令:java -jar signapk.jar platform.x509.pem platform.pk8 test.apk testnew.apk ,在dos 命令名如下图:,其中set.apk 是指我们要签名的原始文件apk,后面setnew.apk 是指我们签名后输出的apk文件的名称
Tip:在签名的时候必须将set.apk事先用rar 文件打开,进入META-INF目录下,将CERT.SF和CERT.RSA这两个文件删除掉,再执行如上操作。到了这一步,程序己经可以正常安装了。
如果提示 FaiLure [INSTALL_FAILED_ALREADY_EXISTS],请使用如下命令,将应用程序移除:,uninstall 后面字符是指应用程序所在的包名,再运行adb install [package name] 就可以安装成功。
Tip:不要忘了在你的manifest文件下注册android:sharedUserId="android.uid.system" 。
如果你照着如上的步骤一步一步写的话,保证可以成功修改系统的时间或者日期等操作。
最后
以上就是外向胡萝卜为你收集整理的修改系统时间的全部内容,希望文章能够帮你解决修改系统时间所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复