Pārlūkot izejas kodu

增加同步服务器时间和时区功能

weizhengliang 2 gadi atpakaļ
vecāks
revīzija
b34bb92a0a

+ 12 - 0
common/src/main/code/com/wdkl/ncs/android/lib/utils/TimeHandle.kt

@@ -1,5 +1,6 @@
 package com.wdkl.ncs.android.lib.utils
 
+import java.text.SimpleDateFormat
 import java.util.*
 
 /**
@@ -59,4 +60,15 @@ object TimeHandle {
     fun getDay(time: Int): Int {
         return time / (60 * 60 * 24)
     }
+
+    //按指定格式获取指定日期时间
+    fun getDateTime(timeMillis: Long, format: String): String {
+        if (timeMillis > 0) {
+            val date = Date(timeMillis)
+            val sdf = SimpleDateFormat(format)
+            //sdf.timeZone = TimeZone.getTimeZone("GMT+8")
+            return sdf.format(date)
+        }
+        return "null"
+    }
 }

+ 33 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/HomeActivity.kt

@@ -24,6 +24,7 @@ import android.text.TextUtils
 import android.util.Log
 import android.view.KeyEvent
 import android.view.View
+import com.alibaba.fastjson.JSON
 import com.enation.javashop.net.engine.model.NetState
 import com.enation.javashop.net.engine.plugin.permission.RxPermissions
 import com.enation.javashop.utils.base.tool.CommonTool
@@ -45,6 +46,7 @@ import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.utils.AppTool
+import com.wdkl.ncs.android.lib.utils.TimeHandle
 import com.wdkl.ncs.android.lib.utils.joinManager
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.logic.contract.home.HomeActivityContract
@@ -579,10 +581,41 @@ class HomeActivity : BaseActivity<HomeActivityPresenter, ActivityHomeBinding>(),
                 if (!TextUtils.isEmpty(Constants.imei)) {
                     presenter.getDeviceVO(Constants.imei)
                 }
+            } else if (tcp.action == TcpAction.TimeAction.SYNC) {
+                var time = 0L
+                var timeZone="Asia/Shanghai"
+                if (canParseJson(tcp.data.toString())) {
+                    val json = JSON.parseObject(tcp.data.toString())
+                    time = json.getLong("time")*1000
+                    timeZone = json.getString("time_zone")
+                } else {
+                    time = tcp.data.toString().toLong() * 1000
+                }
+
+                try {
+                    AppUtils.setSystemTime(BaseApplication.appContext, time, timeZone)
+                    Log.d("setTime", "set sys time1: $time, $timeZone")
+                } catch (e: Exception) {
+                    //"20211213:092314"
+                    val timeStr = TimeHandle.getDateTime(time, "yyyyMMdd.HHmmss")
+                    AppUtils.setSysTime(timeStr, timeZone)
+                    Log.d("setTime", "set sys time2: $timeStr, $timeZone")
+                }
             }
         }
     }
 
+    private fun canParseJson(str:String) : Boolean {
+        var result = false
+        try {
+            JSON.parseObject(str)
+            result=true
+        }catch (e:java.lang.Exception){
+            result=false
+        }
+        return result
+    }
+
 
     inner class TimeReceiver: BroadcastReceiver() {
         override fun onReceive(context: Context, intent: Intent) {

+ 65 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/AppUtils.java

@@ -6,11 +6,15 @@ import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.media.AudioManager;
+import android.text.TextUtils;
 import android.util.Log;
 
 import com.wdkl.ncs.android.component.home.activity.HomeActivity;
 import com.wdkl.ncs.android.lib.base.BaseApplication;
 
+import java.io.DataOutputStream;
+import java.io.IOException;
+
 public class AppUtils {
 
     public static void restartApp() {
@@ -31,6 +35,67 @@ public class AppUtils {
         System.exit(0);
     }
 
+    public static void setSystemTime(Context context, long timeMills, String timeZone) {
+        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+        //alarmManager.setTimeZone("Asia/Shanghai");
+        alarmManager.setTimeZone(timeZone);
+        alarmManager.setTime(timeMills);
+    }
+
+    /**
+     * 设置系统时间
+     *
+     * @param time
+     */
+    public static void setSysTime(String time, String timeZone) {
+        try {
+            Process process = Runtime.getRuntime().exec("su");
+            if (null == process) return;
+            DataOutputStream os = new DataOutputStream(process.getOutputStream());
+            //os.writeBytes("setprop persist.sys.timezone Asia/Shanghai\n");
+            os.writeBytes("setprop persist.sys.timezone " + timeZone + "\n");
+            if (android.os.Build.VERSION.SDK_INT >= 24) {//7.1以上的系统
+                String datetime = changeTimeForm(time); //20211213:092314  ------  051315372019.00
+                os.writeBytes("/system/bin/date " + datetime + " set\n");
+            } else {
+                os.writeBytes("/system/bin/date -s " + time + "\n");//【时间格式 yyyyMMdd.HHmmss】"20131023.112800"
+            }
+            os.writeBytes("clock -w\n");
+            os.writeBytes("exit\n");
+            os.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String changeTimeForm(String t) {
+        if (!TextUtils.isEmpty(t) && t.length() >= 15) {
+            String yyyy = substringByLengh(t, 0, 4);
+            String MMdd = substringByLengh(t, 4, 8);
+            String HHmm = substringByLengh(t, 9, 13);
+            String ss = substringByLengh(t, 13, 15);
+
+            return MMdd + HHmm + yyyy + "." + ss;
+        } else {
+            return "051315372019.00";
+        }
+    }
+
+    public static String substringByLengh(String str, int start, int end) {
+        if (str == null) {
+            return "";
+        }
+        if (start > end) {
+            return "";
+        }
+        if (str.length() - 1 < start || str.length() < end) {
+            return "";
+        }
+
+        return str.substring(start, end);
+    }
+
+
     public static void switchAudioMode(Context context, boolean speakerOn) {
         AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
         audioManager.setSpeakerphoneOn(speakerOn);

+ 2 - 6
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java

@@ -80,6 +80,7 @@ public class DeviceChannel {
                 }
                 break;
             case CALLBACK:
+            case BROADCAST:
                 break;
             case IM:
                 if (tcpModel.getAction() == TcpAction.IMAction.MSG){
@@ -90,19 +91,14 @@ public class DeviceChannel {
                 EventBus.getDefault().post(new MessageEvent(tcpModel, 999));
                 break;
             case DATA:
-                if (tcpModel.getAction() == TcpAction.DataAction.REFRESH){
-                    EventBus.getDefault().post(new MessageEvent(tcpModel, Constants.TCP_MSG));
-                }
-                break;
             case TIME:
+                EventBus.getDefault().post(new MessageEvent(tcpModel, Constants.TCP_MSG));
                 break;
             case EVENT:
                 if (tcpModel.getAction() == TcpAction.EventAction.KEY_CLICK){
                     EventBus.getDefault().post(new MessageEvent(tcpModel, 3));
                 }
                 break;
-            case BROADCAST:
-                break;
             default:
                 EventBus.getDefault().post(new MessageEvent(tcpModel, 0));
         }