Android獲取所在時區(qū)時間的兩種方式
Android獲取所在時區(qū)正確時間的方式有兩種:
一:wifi獲取時間
在聯(lián)網(wǎng)且系統(tǒng)設(shè)置了自動獲取時間,自動獲取時區(qū)的系統(tǒng)設(shè)置前提下,系統(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)絡(luò)不可用,使用GPS進行刷新系統(tǒng)時間,系統(tǒng)時間更新后會自動更新TextClock和DateClock;如果有網(wǎng)絡(luò),理論上會自動刷新系統(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)絡(luò)啟動獲取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)限,普通應(yīng)用無法設(shè)置系統(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); // 設(shè)置系統(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(); //設(shè)置定位監(jiān)聽 mlocationClient.setLocationListener(new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation != null) { if (aMapLocation.getErrorCode() == 0) { //定位成功回調(diào)信息,設(shè)置相關(guān)消息 aMapLocation.getLocationType();//獲取當前定位結(jié)果來源,如網(wǎng)絡(luò)定位結(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 + ";停止了定位并開始設(shè)置系統(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()); } } }}); //設(shè)置定位模式為高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅設(shè)備模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //設(shè)置定位間隔,單位毫秒,默認為2000ms mLocationOption.setInterval(1000); //設(shè)置定位參數(shù) mlocationClient.setLocationOption(mLocationOption); // 此方法為每隔固定時間會發(fā)起一次定位請求,為了減少電量消耗或網(wǎng)絡(luò)流量消耗, // 注意設(shè)置合適的定位時間的間隔(最小間隔支持為1000ms),并且在合適時間調(diào)用stopLocation()方法來取消定位請求 // 在定位結(jié)束后,在合適的生命周期調(diào)用onDestroy()方法 // 在單次定位情況下,定位無論成功與否,都無需調(diào)用stopLocation()方法移除請求,定位sdk內(nèi)部會移除 //啟動定位 mlocationClient.startLocation(); }
三:注意,預(yù)加載 GPS 并不是解決 Android 時間顯示不準確的最佳方法。雖然 GPS 可以提供精確的時間和位置信息,但在大多數(shù)情況下,并不需要通過 GPS 來確保時間的準確性。通常,Android 設(shè)備會自動從網(wǎng)絡(luò)提供商(例如移動網(wǎng)絡(luò)或Wi-Fi連接)獲取準確的時間和時區(qū)信息。這個過程通常稱為網(wǎng)絡(luò)時間同步。因此,如果你的自定義 Launcher 在獲取時間時不準確,很可能是由于設(shè)備的網(wǎng)絡(luò)時間同步設(shè)置出現(xiàn)了問題,而不是時區(qū)設(shè)置的問題。
以上就是Android獲取所在時區(qū)時間的兩種方式的詳細內(nèi)容,更多關(guān)于Android獲取時間的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android自定義豎排TextView實現(xiàn)實例
這篇文章主要介紹了Android自定義豎排TextView實現(xiàn)實例的相關(guān)資料,需要的朋友可以參考下2017-05-05android SectorMenuView底部導(dǎo)航扇形菜單的實現(xiàn)代碼
這篇文章主要介紹了android SectorMenuView底部導(dǎo)航扇形菜單的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02android PopupWindow 和 Activity彈出窗口實現(xiàn)方式
本人小菜一個。目前只見過兩種彈出框的實現(xiàn)方式,第一種是最常見的PopupWindow,第二種也就是Activity的方式是前幾天才見識過,需要的朋友可以參考下2012-11-11