Android修改时间实现
2016-05-30 22:53
661 查看
一、需要root过系统
下面的代码实现需要系统root过的。package com.example.util; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.util.Calendar; import android.os.SystemClock; public class SystemDateTime { public static void setDateTime(long when) throws IOException, InterruptedException { requestPermission(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); if(now - when > 1000) throw new IOException("failed to set Date."); } public static void setDateTime(int year, int month, int day, int hour, int minute, int Sec) throws IOException, InterruptedException { requestPermission(); Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month-1); c.set(Calendar.DAY_OF_MONTH, day); c.set(Calendar.HOUR_OF_DAY, hour); c.set(Calendar.MINUTE, minute); c.set(Calendar.SECOND, Sec); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); if(now - when > 1000) throw new IOException("failed to set Date."); } public static void setDate(int year, int month, int day) throws IOException, InterruptedException { requestPermission(); Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month); c.set(Calendar.DAY_OF_MONTH, day); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); if(now - when > 1000) throw new IOException("failed to set Date."); } public static void setTime(int hour, int minute) throws IOException, InterruptedException { requestPermission(); Calendar c = Calendar.getInstance(); c.set(Calendar.HOUR_OF_DAY, hour); c.set(Calendar.MINUTE, minute); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); if(now - when > 1000) throw new IOException("failed to set Time."); } static void requestPermission() throws InterruptedException, IOException { createSuProcess("chmod 666 /dev/alarm").waitFor(); } static Process createSuProcess() throws IOException { File rootUser = new File("/system/xbin/ru"); if(rootUser.exists()) { return Runtime.getRuntime().exec(rootUser.getAbsolutePath()); } else { return Runtime.getRuntime().exec("su"); } } static Process createSuProcess(String cmd) throws IOException { DataOutputStream os = null; Process process = createSuProcess(); try { os = new DataOutputStream(process.getOutputStream()); os.writeBytes(cmd + "\n"); os.writeBytes("exit $?\n"); } finally { if(os != null) { try { os.close(); } catch (IOException e) { } } } return process; } }
createSuProcess(“chmod 666 /dev/alarm”)是用系统root权限进程来修改/dev/alarm目录的读写属性。“666”是能赋予各个组读写权限。chmod是Linux下修改权限属性的命令。Runtime.getRuntime().exec(“su”);是提权为root以root身份来执行命令。Runtime.getRuntime().exec(rootUser.getAbsolutePath());是获取系统root用户的绝对地址来获得root权限。像这些os.writeBytes(cmd + “\n”);是用给系统下达相应的命令,cmd是用户给的命令。
二、需要系统签名
实现代码和上面的代码差不多,只是没有提权部分代码而已。package com.example.util; import java.io.IOException; import java.util.Calendar; import com.sanlian.ui.MainActivity; import android.os.SystemClock; import android.util.Log; public class SystemDateTimeUId { public static void setDateTime(long when) throws IOException, InterruptedException { if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); if(now - when > 1000) { MainActivity.setDateTime = false; throw new IOException("failed to set Date."); } else { MainActivity.setDateTime = true; } } public static void setDateTime(int year, int month, int day, int hour, int minute, int Sec) throws IOException, InterruptedException { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month-1); c.set(Calendar.DAY_OF_MONTH, day); c.set(Calendar.HOUR_OF_DAY, hour); c.set(Calendar.MINUTE, minute); c.set(Calendar.SECOND, Sec); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); if(now - when > 1000) { MainActivity.setDateTime = false; throw new IOException("failed to set Date."); } else { MainActivity.setDateTime = true; } } public static void setDate(int year, int month, int day) throws IOException, InterruptedException { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month); c.set(Calendar.DAY_OF_MONTH, day); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); if(now - when > 1000) { MainActivity.setDateTime = false; throw new IOException("failed to set Date."); } else { MainActivity.setDateTime = true; } } public static void setTime(int hour, int minute) throws IOException, InterruptedException { Calendar c = Calendar.getInstance(); c.set(Calendar.HOUR_OF_DAY, hour); c.set(Calendar.MINUTE, minute); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); if(now - when > 1000) { MainActivity.setDateTime = false; throw new IOException("failed to set Date."); } else { MainActivity.setDateTime = true; } } }
在AndroidManifest.xml里的头添加android:sharedUserId=”android.uid.system”像下面代码这样。这是将自己的程序加入到了系统的进程中,获得系统权限。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example" android:sharedUserId="android.uid.system" android:versionCode="1" android:versionName="1.0" >
打包后的代码还要添加对应系统的系统签名。我的系统签名文件是platform.pk8和platform.x509.pem。各系统需要各自的系统厂家提供系统签名。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories