Android 校正系統時間的三種解決方案
前言
在開發過程中我們常常需要獲取系統時間。
Android系統的自動確認時間,是由系統通過訪問廠家的NTP伺服器的時間,然後修改後得到的。
所以當沒有網路或者在內網環境下的時候,系統無法訪問到NTP伺服器,便會造成系統時間錯誤。
所以這個時候我們就需要程式去修改系統的時間,或者獲取一個正確的時間來代替系統時間。
NTP伺服器
【Network Time Protocol(NTP)】是用來使計算機時間同步化的一種協議,它可以使計算機對其伺服器或時鐘源(如石英鐘,GPS等等)做同步化,它可以提供高精準度的時間校正(LAN上與標準間差小於1毫秒,WAN上幾十毫秒),且可介由加密確認的方式來防止惡毒的協議攻擊。時間按NTP伺服器的等級傳播。按照離外部UTC源的遠近把所有伺服器歸入不同的Stratum(層)中。
解決方案
根據不同的情況,我實現瞭如下三種解決方案:
修改系統時間。
優點:程式啟動時執行一次即可,一勞永逸。
缺點:只能在原生系統中使用,非原生系統無法安裝。(具體後面會解釋)。獲取NTP伺服器時間代替系統時間。
優點:無需Root,適用於任何手機及系統。
缺點:需要可以訪問外部網路,內網環境下則需要一臺自己的NTP伺服器。獲取網頁時間代替系統時間。
優點:無需Root,適用於任何手機及系統,適用於任何網路環境。
缺點:需要一條額外的執行緒,去維護時間準確,容易造成誤差。
程式碼及目錄
GitHub: https://github.com/Demo-DeMon/ChangeTime
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;
}
效果
參考
相關文章
- win10如何校正時間 win10系統時間不同步怎麼校正Win10
- 圖片即時優化的三種簡單解決方案優化
- 爬蟲受限的三種解決方案爬蟲
- iOS 時間校準解決方案iOS
- Linux系統中檔案時間常用的三種型別!Linux型別
- Android中為何獲取系統時間的方法多次執行後時間仍不變,解決方法Android
- sql 語言 groupBy 分組統計時間段解決方案SQL
- linux時間子系統(三)Linux
- linux系統下hyperf 熱更新的另一種解決方案Linux
- android系統日期時間的獲取Android
- ES6 中的 三種非同步解決方案非同步
- 解決代理超時問題的三種方法
- Java 8 的日期與時間問題解決方案Java
- BPM管理系統解決方案
- Android 修改系統息屏時間.Android
- iOS WebView生成長截圖的第三種解決方案iOSWebView
- Win10系統時間不準確的解決方法 Win10系統時間不準怎麼辦?Win10
- Win10系統下時間不同步的解決方法Win10
- iOS全埋點解決方案-時間相關iOS
- ORACLE 臨時表空間滿了的原因解決方案Oracle
- 解決java獲取系統時間差8個小時 專題Java
- 家電公司MES系統解決方案
- 供應鏈系統解決方案
- 採購管理系統解決方案
- OA系統安全解決方案分析
- 智慧停車場解決方案,反向尋車系統解決方案
- Win10系統下電腦時間改不了的解決方法Win10
- Android匯入三方SDK時遇到的一些異常及解決方案Android
- 監控Kubernetes叢集證書過期時間的三種方案
- 跨域的幾種解決方案跨域
- 優雅的快取解決方案--設定過期時間快取
- 關於vsftpd下顯示的時間與系統時間不一致的解決(轉)FTP
- 檢視系統中各種等待時間佔用的資料庫時間比例資料庫
- Win7系統分割槽(C盤)擴容的一種可行的解決方案Win7
- python獲取系統時間(時間函式詳解)Python函式
- 9種常見的Android開發錯誤及解決方案Android
- Android應用啟動黑白屏解決方案及啟動時間優化Android優化
- linux系統程式設計之訊號(八):三種時間結構及定時器setitimer()詳解Linux程式設計定時器