Android获取所在时区时间的两种方式
作者:走路带风
Android获取所在时区正确时间的方式有两种,通过wifi获取时间和通过通过GPS获取时间这两种方式,文中通过代码示例给大家的介绍的非常详细,需要的朋友可以参考下
Android获取所在时区正确时间的方式有两种:
一:wifi获取时间
在联网且系统设置了自动获取时间,自动获取时区的系统设置前提下,系统会自动更新正确的时间,当然如果你用了TextClock
和DateClock
也会自动更新。
二:通过GPS获取时间。
2.1 在未联网且GPS可用的情况下,可以通过获取原生定位信息来获取所在地点的时间,实现如下:
注意,下面的代码时在Fragment里面实现的
/** * 用于获取GPS时间 */ private LocationManager locationManager; /** * 取消后台定位的时间 */ private final static int CANCEL_LOCATION_DELAY = 5 * 60 * 1000; /** * 避免多次取消定位和反注册 */ private boolean isHadCancelLocation = false; /** * 如果网络不可用,使用GPS进行刷新系统时间,系统时间更新后会自动更新TextClock和DateClock;如果有网络,理论上会自动刷新系统时间,所以不处理。 */ private void initSystemTime() { if(!NetworkHelper.isNetworkAvailable(getContext())){ getLocationBySystem(); // 注意,这里请用原始Handler.postDelay代替,我用的自定义延时类。 ArchTaskExecutor.getInstance().postToMainThreadDelay(cancelLocationRunnable, CANCEL_LOCATION_DELAY); } } // 注意,普通app需要申请定位权限,我的是系统级app,所以忽略。 @SuppressLint("MissingPermission") private void getLocationBySystem() { XLog.i("无网络启动获取Gps定位"); locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE); // 注册位置监听器 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } /** * 通过GPS获取定位信息 */ private final LocationListener locationListener = location -> { if(null != location) { // 就这里是关键获取代码,其实高德地图Api能自己触发系统时间的更新,不知道怎么实现的,只要打开他们的地图就可以,不管是第三方的高德地图app还是自己内嵌的高德地图api模块,理论上也是location.getTime()获取到的,不理解的是他们为什么有权限更新系统时间。 long gpsTime = location.getTime(); cancelLocationUpdates(); XLog.i("Gps定位获取成功并注销定位监听,GPS时间 = " + gpsTime); // 用过这个进行模拟测试,resetSystemTime(1712800932000L);显示的时间是2024-04-11 10:02:12,正确 resetSystemTime(gpsTime); } }; private final Runnable cancelLocationRunnable = () -> { XLog.i("获取定位超时,注销定位监听"); cancelLocationUpdates(); }; /** * 获取定位时间成功取消定位 */ public void cancelLocationUpdates() { XLog.i("注销定位监听" + isHadCancelLocation); if (locationManager != null && !isHadCancelLocation) { locationManager.removeUpdates(locationListener); isHadCancelLocation = true; locationManager = null; } } /** * 注意,我的是系统级app,所以忽略动态申请权限,普通应用无法设置系统时间但是可以参考取值。 * 系统级app配置 <uses-permission android:name="android.permission.SET_TIME"/> 权限即可 **/ @SuppressLint("MissingPermission") private void resetSystemTime(Long utcTimeMillis) { try { // 将UTC时间转换为Date对象 Date locationTime = new Date(utcTimeMillis); long localTimeMillis = locationTime.getTime(); // 获取AlarmManager实例 AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); // 设置系统时间(本地时间) if (alarmManager != null) { alarmManager.setTime(localTimeMillis); XLog.i("重置系统时间成功" + localTimeMillis); } } catch (Exception e){ XLog.e("重置系统时间失败"); } }
2.2 如果你接入了高德地图SDK,也可以使用如下api去获取当前地点的时间:
/** * 这里目前获取到GPS返回的正确的时间 * @throws Exception */ @SuppressLint("MissingPermission") public void getLocationByAMap() throws Exception { // 高德地图的api mlocationClient = new AMapLocationClient(getContext()); //初始化定位参数 mLocationOption = new AMapLocationClientOption(); //设置定位监听 mlocationClient.setLocationListener(new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation != null) { if (aMapLocation.getErrorCode() == 0) { //定位成功回调信息,设置相关消息 aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表 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 + ";停止了定位并开始设置系统时间" + 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); //设置定位参数 mlocationClient.setLocationOption(mLocationOption); // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗, // 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求 // 在定位结束后,在合适的生命周期调用onDestroy()方法 // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除 //启动定位 mlocationClient.startLocation(); }
三:注意,预加载 GPS 并不是解决 Android 时间显示不准确的最佳方法。虽然 GPS 可以提供精确的时间和位置信息,但在大多数情况下,并不需要通过 GPS 来确保时间的准确性。通常,Android 设备会自动从网络提供商(例如移动网络或Wi-Fi连接)获取准确的时间和时区信息。这个过程通常称为网络时间同步。因此,如果你的自定义 Launcher 在获取时间时不准确,很可能是由于设备的网络时间同步设置出现了问题,而不是时区设置的问题。
以上就是Android获取所在时区时间的两种方式的详细内容,更多关于Android获取时间的资料请关注脚本之家其它相关文章!