在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性

之后用系统签名工具签名,即可使用alarmManager.setTime 修改时间

 

private void correctTime(final Context context) {        new Thread() {            @Override            public void run() {                long time = SystemUtil.getTimeFromNtpServer("ntp1.aliyun.com");                ToastUtils.showLong("ntp服务器地址获取的时间为:==" + new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss").format(time));                AlarmManager alarmManager = (AlarmManager)                        context.getSystemService(Activity.ALARM_SERVICE);                alarmManager.setTime(time);                getLocalTime();            }        }.start();    }    private void getLocalTime() {        try {            DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            Calendar calendar = Calendar.getInstance();            calendar.setTimeInMillis(System.currentTimeMillis());            String format = formatter.format(calendar.getTime());            ToastUtils.showLong("当前系统时间为: \n" + format, Toast.LENGTH_SHORT);            textView.setText("当前系统时间为: \n" + format);        } catch (Exception e) {            e.printStackTrace();        }    }

 

 

public class SystemUtil {    private static final int NTP_TIME_OUT_MILLISECOND = 30000;    /**     * 从ntp服务器中获取时间     *     * @param ntpHost ntp服务器域名地址     * @return 如果失败返回-1,否则返回当前的毫秒数     */    public static long getTimeFromNtpServer(String ntpHost) {        LogUtils.i("get time from " + ntpHost);        SntpClient client = new SntpClient();        boolean isSuccessful = client.requestTime(ntpHost, NTP_TIME_OUT_MILLISECOND);        if (isSuccessful) {            return client.getNtpTime();        }        return -1;    }}

 

public class SntpClient {    private static final String TAG = "SntpClient";    private static final int REFERENCE_TIME_OFFSET = 16;    private static final int ORIGINATE_TIME_OFFSET = 24;    private static final int RECEIVE_TIME_OFFSET = 32;    private static final int TRANSMIT_TIME_OFFSET = 40;    private static final int NTP_PACKET_SIZE = 48;    private static final int NTP_PORT = 123;    private static final int NTP_MODE_CLIENT = 3;    private static final int NTP_VERSION = 3;    // Number of seconds between Jan 1, 1900 and Jan 1, 1970    // 70 years plus 17 leap days    private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L;    // system time computed from NTP server response    private long mNtpTime;    // value of SystemClock.elapsedRealtime() corresponding to mNtpTime    private long mNtpTimeReference;    // round trip time in milliseconds    private long mRoundTripTime;    /**     * Sends an SNTP request to the given host and processes the response.     *     * @param host    host name of the server.     * @param timeout network timeout in milliseconds.     * @return true if the transaction was successful.     */    public boolean requestTime(String host, int timeout) {        DatagramSocket socket = null;        try {            socket = new DatagramSocket();            socket.setSoTimeout(timeout);            InetAddress address = InetAddress.getByName(host);            byte[] buffer = new byte[NTP_PACKET_SIZE];            DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT);            // set mode = 3 (client) and version = 3            // mode is in low 3 bits of first byte            // version is in bits 3-5 of first byte            buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3);            // get current time and write it to the request packet            long requestTime = System.currentTimeMillis();            long requestTicks = SystemClock.elapsedRealtime();            writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET, requestTime);            socket.send(request);            // read the response            DatagramPacket response = new DatagramPacket(buffer, buffer.length);            socket.receive(response);            long responseTicks = SystemClock.elapsedRealtime();            long responseTime = requestTime + (responseTicks - requestTicks);            // extract the results            long originateTime = readTimeStamp(buffer, ORIGINATE_TIME_OFFSET);            long receiveTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET);            long transmitTime = readTimeStamp(buffer, TRANSMIT_TIME_OFFSET);            long roundTripTime = responseTicks - requestTicks - (transmitTime - receiveTime);            // receiveTime = originateTime + transit + skew            // responseTime = transmitTime + transit - skew            // clockOffset = ((receiveTime - originateTime) + (transmitTime - responseTime))/2            //             = ((originateTime + transit + skew - originateTime) +            //                (transmitTime - (transmitTime + transit - skew)))/2            //             = ((transit + skew) + (transmitTime - transmitTime - transit + skew))/2            //             = (transit + skew - transit + skew)/2            //             = (2 * skew)/2 = skew            long clockOffset = ((receiveTime - originateTime) + (transmitTime - responseTime)) / 2;            // if (false) Log.d(TAG, "round trip: " + roundTripTime + " ms");            // if (false) Log.d(TAG, "clock offset: " + clockOffset + " ms");            // save our results - use the times on this side of the network latency            // (response rather than request time)            mNtpTime = responseTime + clockOffset;            mNtpTimeReference = responseTicks;            mRoundTripTime = roundTripTime;        } catch (Exception e) {            if (false) {                Log.d(TAG, "request time failed: " + e);            }            return false;        } finally {            if (socket != null) {                socket.close();            }        }        return true;    }    /**     * Returns the reference clock value (value of     * SystemClock.elapsedRealtime())     * corresponding to the NTP time.     *     * @return reference clock corresponding to the NTP time.     */    public long getNtpTimeReference() {        return mNtpTimeReference;    }    /**     * Returns the round trip time of the NTP transaction     *     * @return round trip time in milliseconds.     */    public long getRoundTripTime() {        return mRoundTripTime;    }    public long getNtpTime() {        return mNtpTime;    }    /**     * Reads an unsigned 32 bit big endian number from the given offset in the buffer.     */    private long read32(byte[] buffer, int offset) {        byte b0 = buffer[offset];        byte b1 = buffer[offset + 1];        byte b2 = buffer[offset + 2];        byte b3 = buffer[offset + 3];        // convert signed bytes to unsigned values        int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0);        int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1);        int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2);        int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3);        return ((long) i0 << 24) + ((long) i1 << 16) + ((long) i2 << 8) + (long) i3;    }    /**     * Reads the NTP time stamp at the given offset in the buffer and returns     * it as a system time (milliseconds since January 1, 1970).     */    private long readTimeStamp(byte[] buffer, int offset) {        long seconds = read32(buffer, offset);        long fraction = read32(buffer, offset + 4);        return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L) / 0x100000000L);    }    /**     * Writes system time (milliseconds since January 1, 1970) as an NTP time stamp     * at the given offset in the buffer.     */    private void writeTimeStamp(byte[] buffer, int offset, long time) {        long seconds = time / 1000L;        long milliseconds = time - seconds * 1000L;        seconds += OFFSET_1900_TO_1970;        // write seconds in big endian format        buffer[offset++] = (byte) (seconds >> 24);        buffer[offset++] = (byte) (seconds >> 16);        buffer[offset++] = (byte) (seconds >> 8);        buffer[offset++] = (byte) (seconds >> 0);        long fraction = milliseconds * 0x100000000L / 1000L;        // write fraction in big endian format        buffer[offset++] = (byte) (fraction >> 24);        buffer[offset++] = (byte) (fraction >> 16);        buffer[offset++] = (byte) (fraction >> 8);        // low order bits should be random data        buffer[offset++] = (byte) (Math.random() * 255.0);    }}

 

更多相关文章

  1. Android 系统启动过程简略分析
  2. android图形系统
  3. Android省市区3级联动的地址列表的实现
  4. android Q 显示系统(一) VSync
  5. google迈向IoT的开端——推出Android Things操作系统
  6. Android的Launcher成为系统中第一个启动的,也是唯一的Launcher
  7. 【 Android 10 系统启动 】系列 -- ShutdownThread(关机流程)
  8. Android系统架构-[Android取经之路]

随机推荐

  1. mysql5.7.19 winx64安装配置方法图文教程
  2. MySql超长自动截断实例详解
  3. mysql 5.7.15 安装配置方法图文教程(wind
  4. Mysql 5.6.37 winx64安装双版本mysql笔记
  5. centos6.5下mysql 5.7.19 安装配置方法
  6. mysql5.7.19 安装配置方法图文教程(win10
  7. mysql5.7.19 winx64解压缩版安装配置教程
  8. MySql安装与卸载的详细教程
  9. mysql连接查询(左连接,右连接,内连接)
  10. centos6.4下mysql5.7.18安装配置方法图文