1、 persist.sys.NoLocationCycle 通过此环境属性 控制是否执行周期定位功能。(增加一种只有手动获取定位的省电模式)
authorsnickersun <scy@incartech.cn>
Sat, 9 May 2020 04:21:03 +0000 (12:21 +0800)
committersnickersun <scy@incartech.cn>
Sat, 9 May 2020 04:21:03 +0000 (12:21 +0800)
2、 根据登录指令AP00的返回时间和时区 设置系统时间和周期。
3、 添加sms指令 #nolocationcycle#=current#, #nolocationcycle#=true#, #nolocationcycle#=false#
4、sms cmd 解析前去掉头尾的空格,以便加强兼容性。

app/src/main/java/com/enqualcomm/support/Config.java
app/src/main/java/com/enqualcomm/support/CoreService.java
app/src/main/java/com/enqualcomm/support/ICSmsManager.java
app/src/main/java/com/enqualcomm/support/NMEAListener.java
app/src/main/java/com/enqualcomm/support/adapter/protocolAPIHelper.java
app/src/main/java/com/enqualcomm/support/utils/NettyConnection.java
app/src/main/java/com/enqualcomm/support/utils/TimeUtil.java
app/src/main/java/com/enqualcomm/support/utils/Util.java

index 7d0f7a6..6d77af7 100644 (file)
@@ -9,6 +9,7 @@ import com.enqualcomm.support.bean.Runtime;
 import com.enqualcomm.support.utils.ICLogger;\r
 import com.enqualcomm.support.utils.SharPreferenceUtil;\r
 import com.enqualcomm.support.utils.TimeUtil;\r
+import com.enqualcomm.support.utils.Util;\r
 \r
 import org.json.JSONException;\r
 import org.json.JSONStringer;\r
@@ -294,5 +295,16 @@ public class Config {
     ICLogger.i("Current BootDate="+currentDate+", Last BootDate="+lastDate+", ret="+ret);\r
     return ret;\r
   }\r
+\r
+  public static boolean noLocationCycle=getNoLocationCycleFlag();\r
+  public static boolean getNoLocationCycleFlag(){\r
+      String tmp=Util.getSystemProperties("persist.sys.NoLocationCycle");\r
+      boolean ret=false;\r
+      if (tmp.equals("true"))\r
+          ret=true;\r
+\r
+      noLocationCycle=ret;\r
+     return ret;\r
+  }\r
 }\r
 \r
index ad69682..b7bc09f 100644 (file)
@@ -828,7 +828,8 @@ public class CoreService extends Service {
                 break;\r
         }\r
 \r
-        AlarmHelper.setRealTimeAlarmInSeconds(runtime.getContextProxy().context,cycle, ACTION_LOCATION_ALARM);\r
+        if (Config.noLocationCycle==false)\r
+            AlarmHelper.setRealTimeAlarmInSeconds(runtime.getContextProxy().context,cycle, ACTION_LOCATION_ALARM);\r
         sb.append(" setLocationAlarm  "+ACTION_LOCATION_ALARM+" mod "+mod+", cycle in Seconds "+cycle);\r
         ICLogger.i(sb.toString());\r
         if (Config.LOG_TOFILE) FileOutputUtil.fileOutput(runtime.getCacheDir(),"alarmCycle",sb.toString());\r
@@ -892,7 +893,7 @@ public class CoreService extends Service {
         }\r
     }\r
 \r
-     private static final String TAG = "ICSrv." + CoreService.class.getSimpleName();\r
+    private static final String TAG = "ICSrv." + CoreService.class.getSimpleName();\r
 \r
     private ScheduledThreadPoolExecutor mTimer_retry_connect=null;\r
 \r
index 297e77f..e9ad954 100644 (file)
@@ -181,7 +181,7 @@ public class ICSmsManager {
             if (ENCRYPED_HEADER.equals(Config.DefaultSMSPassword)) {\r
                 ENCRYPED_HEADER = "";\r
             }\r
-\r
+            sms=sms.trim();\r
             if (sms.equals(ENCRYPED_HEADER + "#logctl#=upload,all")){\r
                 sms=ENCRYPED_HEADER+"#logctl#=upload,SDLog:Android/ic";\r
             }\r
@@ -758,6 +758,30 @@ public class ICSmsManager {
                 broadCastStartFotaUpdate(mContext);\r
                 sendSMS(phonenumber, "start fota update !");\r
 \r
+            }else if (sms.startsWith(ENCRYPED_HEADER+"#nolocationcycle#=")&& sms.endsWith("#")) {\r
+                String tmp[] = sms.split("=");\r
+                if (tmp.length == 2) {\r
+                    String strtmp=tmp[1].replace("#","");\r
+                    if (strtmp.equalsIgnoreCase("false")){\r
+                        Util.setSystemProperties("persist.sys.NoLocationCycle","false");\r
+                        Config.getNoLocationCycleFlag();\r
+                        sendSMS(phonenumber, "set noLocationCycle false! and trigger one Location");\r
+                        LocationClient locationClient=LocationClient.getInstance();\r
+                        if (locationClient!=null){\r
+                            locationClient.triggerLocationProcess();\r
+                        }\r
+                    }else if (strtmp.equalsIgnoreCase("true")){\r
+                        Util.setSystemProperties("persist.sys.NoLocationCycle","true");\r
+                        Config.getNoLocationCycleFlag();\r
+                        sendSMS(phonenumber, "set noLocationCycle true!");\r
+                    }else if (strtmp.equalsIgnoreCase("current")){\r
+                        sendSMS(phonenumber, "current noLocationCycle "+Config.getNoLocationCycleFlag()+"!");\r
+                    }else {\r
+                        sendSMS(phonenumber, " nolocationcycle cmd Format error!");\r
+                    }\r
+                } else {\r
+                    sendSMS(phonenumber, " nolocationcycle cmd Format error!");\r
+                }\r
             }else {\r
                 return false;\r
             }\r
index d232433..ab635de 100644 (file)
@@ -77,7 +77,8 @@ public class NMEAListener implements NmeaListener, LocationListener {
 \r
 \r
   public void setNoStop(boolean nostop) {\r
-    noStop = nostop;\r
+    if (Config.noLocationCycle==false)\r
+      noStop = nostop;\r
     ICLogger.i("setNoStop " + nostop);\r
     if (noStop == false) {\r
       switch (runtime.getLocationInstance().getWorkingMod()) {\r
index bbb8045..5c79bc2 100644 (file)
@@ -31,7 +31,9 @@ import com.enqualcomm.support.utils.TimeUtil;
 import com.enqualcomm.support.utils.Util;\r
 \r
 import java.io.File;\r
+import java.sql.Time;\r
 import java.util.ArrayList;\r
+import java.util.Date;\r
 import java.util.HashMap;\r
 \r
 import static com.enqualcomm.support.Constants.ACTION_EQC_ALARM;\r
@@ -310,7 +312,7 @@ public class protocolAPIHelper {
     }\r
 \r
     //处理 登录 BP00\r
-    public void handleBP00(String cmd){\r
+    public void handleBP00(Runtime runtime,String cmd){\r
         String[] msg=cmd.split(CMDSPLIT);\r
 //        get Msg :IWBP00,20191229171933,8# (size)24\r
 //        12-30 01:19:33.861 6492-6492/com.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 ,  IWBP00,20191229171933,8\r
@@ -318,6 +320,22 @@ public class protocolAPIHelper {
         if (msg.length>=3) {\r
             log("handleBP00", "Set Datetime " + msg[1]);\r
             log("handleBP00", "Set TimeZone " + msg[2]);\r
+\r
+            Date datetime=TimeUtil.parseDatetiime(msg[1]);\r
+            int timezone=Integer.parseInt(msg[2]);\r
+            if (datetime!=null){\r
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());\r
+                TimeUtil.setTimeZone(timezone);\r
+\r
+\r
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());\r
+                TimeUtil.setSysDateTime(runtime.getContextProxy().context,datetime,timezone);\r
+                ICLogger.i("==="+TimeUtil.getDefaultTimeZone());\r
+\r
+            }\r
+//            Set Datetime 20200505112734\r
+//            Set TimeZone 8\r
+\r
         }else{\r
             log("handleBP00","format Error");\r
         }\r
index 38b56fa..83bba98 100644 (file)
@@ -55,7 +55,7 @@ public class NettyConnection implements Connection {
                     if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);\r
                         switch (type){\r
                             case BP00:\r
-                                API.handleBP00(cmd);\r
+                                API.handleBP00(runtime,cmd);\r
                                 ICLogger.i("服务器收到登录包AP00");\r
                                 DeliverCMDMessageToSystem("BP00",cmd);//通知下面线程状态变化\r
                                 break;\r
index 0571dc8..db86919 100644 (file)
@@ -1,10 +1,16 @@
 package com.enqualcomm.support.utils;\r
 \r
+import android.app.AlarmManager;\r
+import android.content.Context;\r
+import android.provider.Settings;\r
+import android.text.format.DateFormat;\r
+\r
 import java.text.ParseException;\r
 import java.text.SimpleDateFormat;\r
 import java.util.Calendar;\r
 import java.util.Date;\r
 import java.util.Locale;\r
+import java.util.TimeZone;\r
 \r
 public class TimeUtil {\r
   public static String getLocalTime() { return getLocalTime(System.currentTimeMillis()); }\r
@@ -33,19 +39,22 @@ public class TimeUtil {
 \r
 \r
 \r
-  public static void parseDatetiime(String datetimeStr){\r
+  public static Date parseDatetiime(String datetimeStr){\r
 \r
     SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);//输入的被转化的时间格式\r
     SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//需要转化成的时间格式\r
     SimpleDateFormat df2 = new SimpleDateFormat("yyyyMMddHHmmssSSS");\r
+    SimpleDateFormat df3 = new SimpleDateFormat("yyyyMMddHHmmss");\r
     Date date1 = null;\r
     try {\r
-      date1 = dff.parse(datetimeStr);\r
+      date1 = df3.parse(datetimeStr);\r
+      return date1;\r
     } catch (ParseException e) {\r
       e.printStackTrace();\r
+      return null;\r
     }\r
-    String str1 = df1.format(date1);\r
-    String str2 = df2.format(date1);\r
+//    String str1 = df1.format(date1);\r
+//    String str2 = df2.format(date1);\r
 \r
   }\r
 \r
@@ -81,5 +90,118 @@ public class TimeUtil {
     return dateStr;\r
   }\r
 \r
+  public  static boolean is24Hour(Context mContext){\r
+    return   DateFormat.is24HourFormat(mContext);\r
+  }\r
+\r
+  public  static void set24Hour(Context mContext,boolean _is24Hour){\r
+    if (_is24Hour) {\r
+      android.provider.Settings.System.putString(mContext.getContentResolver(),\r
+              android.provider.Settings.System.TIME_12_24, "24");\r
+    }else{\r
+      android.provider.Settings.System.putString(mContext.getContentResolver(),\r
+              android.provider.Settings.System.TIME_12_24, "12");\r
+    }\r
+  }\r
+\r
+  public static boolean isTimeZoneAuto(Context mContext){\r
+    try {\r
+      return  android.provider.Settings.Global.getInt(mContext.getContentResolver(),\r
+              android.provider.Settings.Global.AUTO_TIME_ZONE) > 0;\r
+    } catch (Settings.SettingNotFoundException e) {\r
+      e.printStackTrace();\r
+      return false;\r
+    }\r
+  }\r
+  public static void setAutoTimeZone(Context mContext,int checked){\r
+    android.provider.Settings.Global.putInt(mContext.getContentResolver(),\r
+            android.provider.Settings.Global.AUTO_TIME_ZONE, checked);\r
+  }\r
+\r
+  public static boolean isDateTimeAuto(Context mContext){\r
+    try {\r
+      return android.provider.Settings.Global.getInt(mContext.getContentResolver(),\r
+              android.provider.Settings.Global.AUTO_TIME) > 0;\r
+    } catch (Settings.SettingNotFoundException e) {\r
+      e.printStackTrace();\r
+      return false;\r
+    }\r
+  }\r
+\r
+  public static void setAutoDateTime(Context mContext,int checked){\r
+    android.provider.Settings.Global.putInt(mContext.getContentResolver(),\r
+            android.provider.Settings.Global.AUTO_TIME, checked);\r
+  }\r
+\r
+\r
+  public static void setSysDateTime(Context mContext,Date datetime,int timezone){\r
+\r
+\r
+    String timezone_name="";\r
+    if(timezone>0) {\r
+      timezone_name=String.format("GMT+%1$02d:00", Math.abs(timezone));\r
+\r
+    }else{\r
+      timezone_name=String.format("GMT-%1$02d:00", Math.abs(timezone));\r
+    }\r
+     TimeZone tz = TimeZone.getTimeZone(timezone_name);\r
+    ICLogger.i("====set timezone "+tz.getDisplayName());\r
+    Calendar c = Calendar.getInstance();\r
+    c.setTime(datetime);\r
+    if (is24Hour(mContext)){\r
+      c.add(Calendar.HOUR_OF_DAY, timezone);//24小时制\r
+    }else{\r
+      c.add(Calendar.HOUR, timezone);//12小时制\r
+    }\r
+    c.setTimeZone(tz);\r
+    long when = c.getTimeInMillis();\r
+    ICLogger.i("====set time "+c.toString());\r
+    if(when / 1000 < Integer.MAX_VALUE){\r
+      ((AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE)).setTime(when);\r
+    }\r
+  }\r
+\r
+  public static void setSysTime(Context mContext,int hour,int minute,int secounds){\r
+    Calendar c = Calendar.getInstance();\r
+    c.set(Calendar.HOUR_OF_DAY, hour);\r
+    c.set(Calendar.MINUTE, minute);\r
+    c.set(Calendar.SECOND, secounds);\r
+    c.set(Calendar.MILLISECOND, 0);\r
+\r
+    long when = c.getTimeInMillis();\r
+    ICLogger.i("====set time "+c.toString());\r
+    if(when / 1000 < Integer.MAX_VALUE){\r
+      ((AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE)).setTime(when);\r
+    }\r
+  }\r
+\r
+  // 获取 “GMT+08:00”对应的时区\r
+//  TimeZone china = TimeZone.getTimeZone("GMT+:08:00");\r
+  // 获取 “中国/重庆”对应的时区\r
+//  TimeZone chongqing = TimeZone.getTimeZone("Asia/Chongqing");\r
+\r
+  public static void setTimeZone(String timeZone){\r
+    final Calendar now = Calendar.getInstance();\r
+    TimeZone tz = TimeZone.getTimeZone(timeZone);\r
+    now.setTimeZone(tz);\r
+  }\r
+  public static void setTimeZone(int timeZone){\r
+    final Calendar now = Calendar.getInstance();\r
+    timeZone--;\r
+    String timezone_name="";\r
+    if(timeZone>0) {\r
+      timezone_name=String.format("GMT+%1$02d:00", Math.abs(timeZone));\r
+\r
+    }else{\r
+      timezone_name=String.format("GMT-%1$02d:00", Math.abs(timeZone));\r
+    }\r
+    ICLogger.i("====set timezone "+timezone_name);\r
+    TimeZone tz = TimeZone.getTimeZone(timezone_name);\r
+    now.setTimeZone(tz);\r
+    TimeZone.setDefault(tz);\r
+  }\r
+  public static String getDefaultTimeZone(){\r
+    return TimeZone.getDefault().getDisplayName();\r
+  }\r
 }\r
 \r
index 8cfd2d3..6daf2f5 100644 (file)
@@ -228,7 +228,8 @@ public class Util {
     Class clazz = null;\r
     try {\r
       clazz = Class.forName("android.os.SystemProperties");\r
-      str = (String)clazz.getMethod("get", new Class[] { String.class }).invoke(clazz, new Object[] { prop });\r
+      Method get=clazz.getMethod("get", new Class[] { String.class });\r
+      str = (String)get.invoke(clazz, new Object[] { prop });\r
     } catch (Exception e) {\r
       e.printStackTrace();\r
     }\r
@@ -242,9 +243,9 @@ public class Util {
 \r
       Class<?> c = Class.forName("android.os.SystemProperties");\r
 \r
-      Method get = c.getMethod("set", String.class, String.class );\r
+      Method set = c.getMethod("set", String.class, String.class );\r
 \r
-      get.invoke(c, key, value );\r
+      set.invoke(c, key, value );\r
 \r
     } catch (Exception e) {\r
 \r