Android獲取所在時區(qū)時間的兩種方式
Android獲取所在時區(qū)正確時間的方式有兩種:
一:wifi獲取時間
在聯(lián)網(wǎng)且系統(tǒng)設置了自動獲取時間,自動獲取時區(qū)的系統(tǒng)設置前提下,系統(tǒng)會自動更新正確的時間,當然如果你用了TextClock和DateClock也會自動更新。
二:通過GPS獲取時間。
2.1 在未聯(lián)網(wǎng)且GPS可用的情況下,可以通過獲取原生定位信息來獲取所在地點的時間,實現(xiàn)如下:
注意,下面的代碼時在Fragment里面實現(xiàn)的
/**
* 用于獲取GPS時間
*/
private LocationManager locationManager;
/**
* 取消后臺定位的時間
*/
private final static int CANCEL_LOCATION_DELAY = 5 * 60 * 1000;
/**
* 避免多次取消定位和反注冊
*/
private boolean isHadCancelLocation = false;
/**
* 如果網(wǎng)絡不可用,使用GPS進行刷新系統(tǒng)時間,系統(tǒng)時間更新后會自動更新TextClock和DateClock;如果有網(wǎng)絡,理論上會自動刷新系統(tǒng)時間,所以不處理。
*/
private void initSystemTime() {
if(!NetworkHelper.isNetworkAvailable(getContext())){
getLocationBySystem();
// 注意,這里請用原始Handler.postDelay代替,我用的自定義延時類。
ArchTaskExecutor.getInstance().postToMainThreadDelay(cancelLocationRunnable, CANCEL_LOCATION_DELAY);
}
}
// 注意,普通app需要申請定位權(quán)限,我的是系統(tǒng)級app,所以忽略。
@SuppressLint("MissingPermission")
private void getLocationBySystem() {
XLog.i("無網(wǎng)絡啟動獲取Gps定位");
locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
// 注冊位置監(jiān)聽器
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}
/**
* 通過GPS獲取定位信息
*/
private final LocationListener locationListener = location -> {
if(null != location) {
// 就這里是關(guān)鍵獲取代碼,其實高德地圖Api能自己觸發(fā)系統(tǒng)時間的更新,不知道怎么實現(xiàn)的,只要打開他們的地圖就可以,不管是第三方的高德地圖app還是自己內(nèi)嵌的高德地圖api模塊,理論上也是location.getTime()獲取到的,不理解的是他們?yōu)槭裁从袡?quán)限更新系統(tǒng)時間。
long gpsTime = location.getTime();
cancelLocationUpdates();
XLog.i("Gps定位獲取成功并注銷定位監(jiān)聽,GPS時間 = " + gpsTime);
// 用過這個進行模擬測試,resetSystemTime(1712800932000L);顯示的時間是2024-04-11 10:02:12,正確
resetSystemTime(gpsTime);
}
};
private final Runnable cancelLocationRunnable = () -> {
XLog.i("獲取定位超時,注銷定位監(jiān)聽");
cancelLocationUpdates();
};
/**
* 獲取定位時間成功取消定位
*/
public void cancelLocationUpdates() {
XLog.i("注銷定位監(jiān)聽" + isHadCancelLocation);
if (locationManager != null && !isHadCancelLocation) {
locationManager.removeUpdates(locationListener);
isHadCancelLocation = true;
locationManager = null;
}
}
/**
* 注意,我的是系統(tǒng)級app,所以忽略動態(tài)申請權(quán)限,普通應用無法設置系統(tǒng)時間但是可以參考取值。
* 系統(tǒng)級app配置 <uses-permission android:name="android.permission.SET_TIME"/> 權(quán)限即可
**/
@SuppressLint("MissingPermission")
private void resetSystemTime(Long utcTimeMillis) {
try {
// 將UTC時間轉(zhuǎn)換為Date對象
Date locationTime = new Date(utcTimeMillis);
long localTimeMillis = locationTime.getTime();
// 獲取AlarmManager實例
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
// 設置系統(tǒng)時間(本地時間)
if (alarmManager != null) {
alarmManager.setTime(localTimeMillis);
XLog.i("重置系統(tǒng)時間成功" + localTimeMillis);
}
} catch (Exception e){
XLog.e("重置系統(tǒng)時間失敗");
}
}
2.2 如果你接入了高德地圖SDK,也可以使用如下api去獲取當前地點的時間:
/**
* 這里目前獲取到GPS返回的正確的時間
* @throws Exception
*/
@SuppressLint("MissingPermission")
public void getLocationByAMap() throws Exception {
// 高德地圖的api
mlocationClient = new AMapLocationClient(getContext());
//初始化定位參數(shù)
mLocationOption = new AMapLocationClientOption();
//設置定位監(jiān)聽
mlocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//定位成功回調(diào)信息,設置相關(guān)消息
aMapLocation.getLocationType();//獲取當前定位結(jié)果來源,如網(wǎng)絡定位結(jié)果,詳見定位類型表
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Toast.makeText(getContext(), "時間戳為:" + aMapLocation.getTime(),Toast.LENGTH_SHORT).show();
Date date = new Date(aMapLocation.getTime());
String time = df.format(date);//定位時間
SimpleDateFormat dateFormat = new SimpleDateFormat("MM月dd日");
SimpleDateFormat hourMinuteSecondFormat = new SimpleDateFormat("HH:mm aa");
mlocationClient.stopLocation();// 獲取成功停止定位
Toast.makeText(getContext(), "時間為:" + time + ";停止了定位并開始設置系統(tǒng)時間" + dateFormat + ";" + hourMinuteSecondFormat,Toast.LENGTH_SHORT).show();
// 需要配置 <uses-permission android:name="android.permission.SET_TIME"/>
resetSystemTime(aMapLocation.getTime());
} else {
//顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼表。
Log.e("AmapError", "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
}
}
}});
//設置定位模式為高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅設備模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//設置定位間隔,單位毫秒,默認為2000ms
mLocationOption.setInterval(1000);
//設置定位參數(shù)
mlocationClient.setLocationOption(mLocationOption);
// 此方法為每隔固定時間會發(fā)起一次定位請求,為了減少電量消耗或網(wǎng)絡流量消耗,
// 注意設置合適的定位時間的間隔(最小間隔支持為1000ms),并且在合適時間調(diào)用stopLocation()方法來取消定位請求
// 在定位結(jié)束后,在合適的生命周期調(diào)用onDestroy()方法
// 在單次定位情況下,定位無論成功與否,都無需調(diào)用stopLocation()方法移除請求,定位sdk內(nèi)部會移除
//啟動定位
mlocationClient.startLocation();
}
三:注意,預加載 GPS 并不是解決 Android 時間顯示不準確的最佳方法。雖然 GPS 可以提供精確的時間和位置信息,但在大多數(shù)情況下,并不需要通過 GPS 來確保時間的準確性。通常,Android 設備會自動從網(wǎng)絡提供商(例如移動網(wǎng)絡或Wi-Fi連接)獲取準確的時間和時區(qū)信息。這個過程通常稱為網(wǎng)絡時間同步。因此,如果你的自定義 Launcher 在獲取時間時不準確,很可能是由于設備的網(wǎng)絡時間同步設置出現(xiàn)了問題,而不是時區(qū)設置的問題。
以上就是Android獲取所在時區(qū)時間的兩種方式的詳細內(nèi)容,更多關(guān)于Android獲取時間的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android中可以作為Log開關(guān)的一些操作及安全性詳解
Android的調(diào)試好伙伴Log在調(diào)試時非常有用,基本可以看Log而無需單點調(diào)試,尤其對實時大數(shù)據(jù)量的設備調(diào)試尤其有效,下面這篇文章就來給大家詳細介紹關(guān)于Android中可以作為Log開關(guān)的一些操作及安全性的相關(guān)資料,需要的朋友可以參考下。2017-12-12
Android?Studio開發(fā)實現(xiàn)簡單計算器功能
這篇文章主要為大家詳細介紹了Android?Studio開發(fā)實現(xiàn)簡單計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
如何利用Flutter實現(xiàn)酷狗流暢Tabbar效果
這篇文章主要給大家介紹了關(guān)于如何利用Flutter實現(xiàn)酷狗流暢Tabbar效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-02-02
android 關(guān)于webview 加載h5網(wǎng)頁開啟定位的方法
今天小編就為大家分享一篇android 關(guān)于webview 加載h5網(wǎng)頁開啟定位的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

