From 8ff90d87687b6d38158809aae776b6c709d7b60a Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期四, 04 十二月 2025 12:01:41 +0800
Subject: [PATCH] 指纹钥匙柜

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/KeyCabinetBean.java                 |   20 
 keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwen.png                                     |    0 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationVM.java           |   21 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/guide/TestActivity.java               |    1 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/KeyResultEvent.java                |   14 
 keyCabinet-android/facelibrary/build.gradle                                                         |    4 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationVM.java         |   23 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/SyncGridDataParam.java        |   61 +
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java    |   18 
 keyCabinet-android/app/src/main/res/layout/face_activity.xml                                        |  301 ++++++++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/OpenGridDriverParam.java      |   31 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java                  |   92 +-
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java                |   91 ++
 keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwenyanzheng.png                             |    0 
 keyCabinet-android/app/build.gradle                                                                 |    5 
 keyCabinet-android/datalibrary/build.gradle                                                         |    4 
 keyCabinet-android/settinglibrary/build.gradle                                                      |    4 
 keyCabinet-android/versions.gradle                                                                  |    9 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java                |  332 ++++++---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationActivity.java     |   56 +
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java       |    2 
 keyCabinet-android/lib_opensource/build.gradle                                                      |    4 
 keyCabinet-android/app/libs/enjoySDK.aar                                                            |    0 
 keyCabinet-android/app/src/main/res/layout/change_url_activity.xml                                  |  291 +++++---
 keyCabinet-android/app/src/main/res/layout/main_activity.xml                                        |    5 
 keyCabinet-android/app/src/main/res/layout/key_cabinet_activity.xml                                 |   13 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/FileUtil.java               |   59 +
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java                      |   79 +
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/MCUtils.java                       |   23 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java     |   10 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java |   28 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/BatchOpenGridAdminParam.java  |   10 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/UserManagerActivity.java         |    9 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java                           |    9 
 keyCabinet-android/app/src/main/res/values/strings.xml                                              |    7 
 keyCabinet-android/app/src/main/AndroidManifest.xml                                                 |   59 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetVM.java          |    8 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java   |    7 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/BraceletLogUtils.java              |    4 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java               |   26 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationActivity.java   |  232 ++++++
 keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java                  |   11 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/DevConfigBean.java                  |   20 
 keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwenluru.png                                 |    0 
 44 files changed, 1,590 insertions(+), 413 deletions(-)

diff --git a/keyCabinet-android/app/build.gradle b/keyCabinet-android/app/build.gradle
index ff276e1..ddeec78 100644
--- a/keyCabinet-android/app/build.gradle
+++ b/keyCabinet-android/app/build.gradle
@@ -10,8 +10,8 @@
         applicationId "com.doumee.keyCabinet"
         minSdkVersion build_versions.min_sdk
         targetSdkVersion build_versions.target_sdk
-        versionCode 2
-        versionName "1.0.1"
+        versionCode 5
+        versionName "1.0.5"
 
         //鏀寔vectorDrawables鐭㈤噺鍥�
         vectorDrawables.useSupportLibrary = true
@@ -108,7 +108,6 @@
     implementation project(path: ':settinglibrary')
     implementation 'androidx.legacy:legacy-support-v4:1.0.0'
     implementation files('libs\\simple-xml-2.7.1.jar')
-    implementation files('libs\\API-20250310.jar')
     testImplementation deps.test.junit
     androidTestImplementation deps.test.ext_junit
     androidTestImplementation deps.test.test_espresso
diff --git a/keyCabinet-android/app/libs/enjoySDK.aar b/keyCabinet-android/app/libs/enjoySDK.aar
new file mode 100644
index 0000000..cf7cc8e
--- /dev/null
+++ b/keyCabinet-android/app/libs/enjoySDK.aar
Binary files differ
diff --git a/keyCabinet-android/app/src/main/AndroidManifest.xml b/keyCabinet-android/app/src/main/AndroidManifest.xml
index 9b7b0e1..4658735 100644
--- a/keyCabinet-android/app/src/main/AndroidManifest.xml
+++ b/keyCabinet-android/app/src/main/AndroidManifest.xml
@@ -10,11 +10,16 @@
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:networkSecurityConfig="${network_security_config}"
-        android:requestLegacyExternalStorage="true"
         android:supportsRtl="true"
         android:theme="@style/CustomAppTheme"
         android:usesCleartextTraffic="true"
         tools:replace="android:allowBackup">
+        <activity
+            android:name=".ui.face.ChoseActivationActivity"
+            android:exported="false" />
+        <activity
+            android:name=".ui.face.OfflineActivationActivity"
+            android:exported="false" />
         <activity
             android:name=".ui.keyCabinet.ChangeUrlActivity"
             android:exported="false" />
@@ -27,31 +32,30 @@
         <activity
             android:name=".ui.keyCabinet.KeyCabinetActivity"
             android:exported="false" />
-        <activity android:name=".ui.guide.TestActivity">
-
-        </activity>
+        <activity android:name=".ui.guide.TestActivity" />
         <activity
-            android:name="com.doumee.keyCabinet.ui.face.ErrActivity"
+            android:name=".ui.face.ErrActivity"
             android:exported="false" />
         <activity
-            android:name="com.doumee.keyCabinet.ui.face.UserManagerActivity"
+            android:name=".ui.face.UserManagerActivity"
             android:exported="false" />
         <activity
-            android:name="com.doumee.keyCabinet.ui.face.AddFaceActivity"
+            android:name=".ui.face.AddFaceActivity"
             android:exported="false" />
         <activity
-            android:name="com.doumee.keyCabinet.ui.face.ActivationActivity"
+            android:name=".ui.face.ActivationActivity"
             android:exported="false" />
         <activity
-            android:name="com.doumee.keyCabinet.ui.face.FaceActivity"
+            android:name=".ui.face.FaceActivity"
             android:exported="false"
-            android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
+            android:windowSoftInputMode="stateAlwaysHidden|adjustPan" />
         <activity
-            android:name="com.doumee.keyCabinet.ui.main.MainActivity"
+            android:name=".ui.main.MainActivity"
             android:exported="true"
-            android:launchMode="singleTask" >
+            android:launchMode="singleTask">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
+
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
@@ -75,8 +79,8 @@
                 android:name="android.support.FILE_PROVIDER_PATHS"
                 android:resource="@xml/provider_paths" />
         </provider>
-
-        <!--<receiver
+        <!--
+<receiver
             android:name="com.doumee.keyCabinet.ui.service.BootCompleteReceiver"
             android:enabled="true"
             android:exported="true">
@@ -85,22 +89,25 @@
             <intent-filter android:priority="1000">
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
             </intent-filter>
-        </receiver>-->
-
-        <!--<service android:name="com.doumee.keyCabinet.ui.service.HeartbeatService" />
-        <service android:name="com.doumee.keyCabinet.ui.service.FaceUpdateService" />-->
-
+        </receiver>
+        -->
+        <!--
+<service android:name="com.doumee.keyCabinet.ui.service.HeartbeatService" />
+        <service android:name="com.doumee.keyCabinet.ui.service.FaceUpdateService" />
+        -->
+        <meta-data
+            android:name="android:requestLegacyExternalStorage"
+            android:value="true" />
         <uses-library
             android:name="org.apache.http.legacy"
             android:required="false" />
     </application>
-    <uses-permission android:name="android.permission.ACCESS_SURERUSER" />
-    <uses-permission android:name="android.permission.USB_PERMISSION"/>
-    <uses-feature android:name="android.hardware.usb.host"/>
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-feature android:name="android.hardware.usb.host" />
     <uses-feature android:name="android.hardware.nfc" />
+    <uses-permission android:name="android.permission.ACCESS_SURERUSER" />
+    <uses-permission android:name="android.permission.USB_PERMISSION" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@@ -109,7 +116,7 @@
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.VIBRATE" />
     <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
     <uses-permission
         android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS"
@@ -120,7 +127,6 @@
     <uses-permission
         android:name="android.permission.INTERACT_ACROSS_USERS"
         tools:ignore="ProtectedPermissions" />
-
     <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
     <uses-permission
         android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
@@ -128,6 +134,7 @@
     <uses-permission
         android:name="android.permission.WRITE_SETTINGS"
         tools:ignore="ProtectedPermissions" />
+    <uses-permission android:name="android.permission.ACCESS_USB_PERMISSION"/>
 
     <uses-permission android:name="android.permission.NFC" />
 
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/DevConfigBean.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/DevConfigBean.java
index db00eab..77a4b5a 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/DevConfigBean.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/DevConfigBean.java
@@ -14,12 +14,16 @@
     private String devId;
     //鏄惁鍙岄噸楠岃瘉 0鍚� 1鏄�
     private int doubleAuth;
+    //閰掔簿妫�娴嬪紑鍚細0=寮�鍚紱1=鍏抽棴
+    private int  alcoholStatus;
     //涓婚敭
     private Integer id;
     //澶囨敞
     private String info;
     //璁惧鍚嶇О
     private String name;
+    //浜鸿劯璇嗗埆绂荤嚎婵�娲绘枃浠朵笅杞藉湴鍧�
+    private String activateFileUrl;
     private CabinetConfigDataBean cabinetConfigDataVO;
 
     private List<ManageKeyCabinetBean> cabinetGridInfoVOList;
@@ -103,4 +107,20 @@
     public void setCabinetConfigDataVO(CabinetConfigDataBean cabinetConfigDataVO) {
         this.cabinetConfigDataVO = cabinetConfigDataVO;
     }
+
+    public String getActivateFileUrl() {
+        return activateFileUrl;
+    }
+
+    public void setActivateFileUrl(String activateFileUrl) {
+        this.activateFileUrl = activateFileUrl;
+    }
+
+    public int getAlcoholStatus() {
+        return alcoholStatus;
+    }
+
+    public void setAlcoholStatus(int alcoholStatus) {
+        this.alcoholStatus = alcoholStatus;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/KeyCabinetBean.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/KeyCabinetBean.java
index d1b2017..b3a2b8d 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/KeyCabinetBean.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/KeyCabinetBean.java
@@ -41,6 +41,10 @@
     private Integer status;
     //杩愯鐘舵�� 0姝e父 1鏁呴殰
     private Integer workingStatus;
+    //娲捐溅鐢宠鍗曚富閿�
+    private Integer carUseBookId;
+    //鍙栭挜鍖欐柟寮忥細0=闅忚溅锛�1=娲捐溅鍗曪紱2=淇濇磥鎵撴壂
+    private Integer getKeyWay;
 
     private ObservableField<Boolean> isSelected = new ObservableField<>(false);
     private ObservableField<Integer> text1Color = new ObservableField<>(0xff111111);
@@ -185,4 +189,20 @@
     public ObservableField<Integer> getText2Color() {
         return text2Color;
     }
+
+    public Integer getCarUseBookId() {
+        return carUseBookId;
+    }
+
+    public void setCarUseBookId(Integer carUseBookId) {
+        this.carUseBookId = carUseBookId;
+    }
+
+    public Integer getGetKeyWay() {
+        return getKeyWay;
+    }
+
+    public void setGetKeyWay(Integer getKeyWay) {
+        this.getKeyWay = getKeyWay;
+    }
 }
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/KeyResultEvent.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/KeyResultEvent.java
index a344aa7..6414a1b 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/KeyResultEvent.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/event/KeyResultEvent.java
@@ -4,5 +4,19 @@
  * 閽ュ寵鐩戝惉杩斿洖
  */
 public class KeyResultEvent {
+    //1锛�1鍙锋澘锛�2:2鍙锋澘锛�3锛氫袱鍧楁澘
+    private String type;
+
+    public KeyResultEvent(String type) {
+        this.type = type;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java
index cecbf1b..a5d1e47 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java
@@ -23,7 +23,7 @@
 public interface Apis {
     //娴嬭瘯鏈�
     //String HTTP = "http://192.168.1.45:10010/";
-    String HTTP = "http://192.168.0.212/system_gateway/";
+    String HTTP = "http://10.49.152.112/system_gateway/";
     String HEAT_HTTP = "do?c=220301";
     /**
      * 鏌ヨ鐗堟湰淇℃伅
@@ -44,6 +44,12 @@
      */
     @GET("visitsAdmin/cloudService/web/cabinet/updateRunStatusById")
     Observable<BaseResponse> heart(@Query("id")Integer id);
+
+    /**
+     * 鍚屾鏌滄牸瀹為檯閽ュ寵鏁版嵁
+     */
+    @POST("visitsAdmin/cloudService/web/cabinet/syncGridData")
+    Observable<BaseResponse> syncGridData(@Body RequestBody requestBody);
 
     /**
      * 涓婁紶鎶ラ敊淇℃伅
@@ -128,6 +134,5 @@
      */
     @POST("loginCabinet")
     Observable<BaseResponse<String>> loginCabinet(@Body RequestBody requestBody);
-
 }
 
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/BatchOpenGridAdminParam.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/BatchOpenGridAdminParam.java
index 9ae636c..07d582b 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/BatchOpenGridAdminParam.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/BatchOpenGridAdminParam.java
@@ -7,6 +7,8 @@
     private Integer cabinetId;
     //鏌滄牸涓婚敭鍒楄〃
     private List<Integer> gridIdList;
+    //寮�鍚柟寮忥細0=绯荤粺寮�鍚紱1=鎵嬪姩寮�鍚�
+    private int openType;
 
     public Integer getCabinetId() {
         return cabinetId;
@@ -23,4 +25,12 @@
     public void setGridIdList(List<Integer> gridIdList) {
         this.gridIdList = gridIdList;
     }
+
+    public int getOpenType() {
+        return openType;
+    }
+
+    public void setOpenType(int openType) {
+        this.openType = openType;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/OpenGridDriverParam.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/OpenGridDriverParam.java
index 45696b6..d4261fd 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/OpenGridDriverParam.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/OpenGridDriverParam.java
@@ -12,6 +12,13 @@
     private int cabinetId;
     //鏌滄牸涓婚敭
     private int gridId;
+    //寮�鍚柟寮忥細0=绯荤粺寮�鍚紱1=鎵嬪姩寮�鍚�
+    private int openType;
+
+    //娲捐溅鐢宠鍗曚富閿�
+    private Integer carUseBookId;
+    //鍙栭挜鍖欐柟寮忥細0=闅忚溅锛�1=娲捐溅鍗曪紱2=淇濇磥鎵撴壂
+    private Integer openWay;
 
     public int getAuthType() {
         return authType;
@@ -44,4 +51,28 @@
     public void setGridId(int gridId) {
         this.gridId = gridId;
     }
+
+    public int getOpenType() {
+        return openType;
+    }
+
+    public void setOpenType(int openType) {
+        this.openType = openType;
+    }
+
+    public Integer getCarUseBookId() {
+        return carUseBookId;
+    }
+
+    public void setCarUseBookId(Integer carUseBookId) {
+        this.carUseBookId = carUseBookId;
+    }
+
+    public Integer getOpenWay() {
+        return openWay;
+    }
+
+    public void setOpenWay(Integer openWay) {
+        this.openWay = openWay;
+    }
 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/SyncGridDataParam.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/SyncGridDataParam.java
new file mode 100644
index 0000000..53cfa2f
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/SyncGridDataParam.java
@@ -0,0 +1,61 @@
+package com.doumee.keyCabinet.http.param;
+
+import java.io.Serializable;
+import java.util.List;
+
+//鍚屾鏌滄牸瀹為檯閽ュ寵鏁版嵁
+public class SyncGridDataParam implements Serializable {
+    //閽ュ寵鏌滅紪鍙�
+    private String code;
+
+    private List<GridDTO> gridDTOList;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public List<GridDTO> getGridDTOList() {
+        return gridDTOList;
+    }
+
+    public void setGridDTOList(List<GridDTO> gridDTOList) {
+        this.gridDTOList = gridDTOList;
+    }
+
+    public static class GridDTO{
+        //瀹為檯閽ュ寵缂栫爜
+        private String actualLable;
+        //鏉垮彿
+        private String boardCode;
+        //閫氶亾鍙�
+        private String channelCode;
+
+        public String getActualLable() {
+            return actualLable;
+        }
+
+        public void setActualLable(String actualLable) {
+            this.actualLable = actualLable;
+        }
+
+        public String getBoardCode() {
+            return boardCode;
+        }
+
+        public void setBoardCode(String boardCode) {
+            this.boardCode = boardCode;
+        }
+
+        public String getChannelCode() {
+            return channelCode;
+        }
+
+        public void setChannelCode(String channelCode) {
+            this.channelCode = channelCode;
+        }
+    }
+}
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationActivity.java
new file mode 100644
index 0000000..b98595a
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationActivity.java
@@ -0,0 +1,56 @@
+package com.doumee.keyCabinet.ui.face;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+
+import com.doumee.keyCabinet.R;
+import com.doumee.keyCabinet.base.MyBaseActivity;
+import com.doumee.keyCabinet.databinding.ChoseActivationActivityBinding;
+import com.doumee.keyCabinet.utils.MCUtils;
+import com.doumee.lib_coremodel.bean.event.ActionEventData;
+import com.mc.enjoysdk.McSystemUi;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+@AndroidEntryPoint
+public class ChoseActivationActivity extends MyBaseActivity<ChoseActivationVM, ChoseActivationActivityBinding> {
+
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.chose_activation_activity;
+    }
+
+    @Override
+    public void initView(@Nullable Bundle savedInstanceState) {
+        isToGuild = false;
+        normalConfig();
+        getDB().setModel(getVM());
+
+        McSystemUi mcSystemUi = McSystemUi.getInstance(this);
+        MCUtils.show(mcSystemUi);
+    }
+
+    @Override
+    public void initData(@Nullable Bundle savedInstanceState) {
+
+    }
+
+    @Override
+    protected void doRegister(int type, ActionEventData data) {
+        switch (type){
+            case 1:
+                startActivity(ActivationActivity.class);
+                finish();
+                break;
+            case 2:
+                startActivity(OfflineActivationActivity.class);
+                finish();
+                break;
+            default:
+                break;
+        }
+    }
+}
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationVM.java
new file mode 100644
index 0000000..9f436ec
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationVM.java
@@ -0,0 +1,21 @@
+package com.doumee.keyCabinet.ui.face;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.hilt.lifecycle.ViewModelInject;
+
+import com.doumee.lib_coremodel.base.BaseModel;
+import com.doumee.lib_coremodel.base.DataViewModel;
+
+public class ChoseActivationVM extends DataViewModel {
+    @ViewModelInject
+    public ChoseActivationVM(@NonNull Application application, BaseModel model) {
+        super(application, model);
+    }
+    @Override
+    protected void clickByTypeCommand(int type) {
+        doAction(type);
+    }
+
+}
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
index c4c3570..94257da 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
@@ -121,6 +121,12 @@
 
     private SpannableString getErrPhoneText(){
         String phone = MApplication.getConfigBean().getLinkPhone();
+        if(phone==null){
+            String text = "濡傛湁闂璇疯仈绯荤鐞嗗憳";
+            SpannableString styledText = new SpannableString(text);
+            styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip3), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+            return styledText;
+        }
         String text = "濡傛湁闂璇疯仈绯荤鐞嗗憳"+phone;
         SpannableString styledText = new SpannableString(text);
         styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip3), 0, text.length()-phone.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
@@ -137,14 +143,24 @@
                 //鍙�-绠$悊鍛樹汉鑴搁獙璇�
                 getDB().tvTitle.setText("绠$悊鍛樿韩浠介獙璇�");
                 getDB().clCard.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.GONE);
                 getDB().clFace.setVisibility(View.VISIBLE);
                 setFaceModel(0);
+                break;
+            case 10:
+                //鍙�-绠$悊鍛樻寚绾归獙璇�
+                getDB().tvTitle.setText("绠$悊鍛樿韩浠介獙璇�");
+                getDB().clCard.setVisibility(View.GONE);
+                getDB().clFace.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.VISIBLE);
+                setFaceModel(2);
                 break;
             case 1:
                 //鍙�-绠$悊鍛樺埛鍗¢獙璇�
                 getDB().etEwm.setText("");
                 getDB().tvTitle.setText("绠$悊鍛樿韩浠介獙璇�");
                 getDB().clFace.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.VISIBLE);
                 setFaceModel(2);
                 break;
@@ -152,6 +168,7 @@
                 //鍙�-鍙告満楠岃瘉鏂瑰紡閫夋嫨椤�
                 getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
                 getDB().clFace.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.GONE);
                 getDB().clTip1.setVisibility(View.GONE);
                 getDB().clSjXuan.setVisibility(View.VISIBLE);
@@ -162,9 +179,19 @@
                 //鍙�-鍙告満浜鸿劯楠岃瘉
                 getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
                 getDB().clCard.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.GONE);
                 getDB().clSjXuan.setVisibility(View.GONE);
                 getDB().clFace.setVisibility(View.VISIBLE);
                 setFaceModel(1);
+                break;
+            case 11:
+                //鍙�-鍙告満鎸囩汗楠岃瘉
+                getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
+                getDB().clCard.setVisibility(View.GONE);
+                getDB().clFace.setVisibility(View.GONE);
+                getDB().clSjXuan.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.VISIBLE);
+                setFaceModel(2);
                 break;
             case 3:
                 //鍙�-鍙告満鍒峰崱楠岃瘉
@@ -172,6 +199,7 @@
                 getDB().etEwm.requestFocus();
                 getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
                 getDB().clFace.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.GONE);
                 getDB().clSjXuan.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.VISIBLE);
                 setFaceModel(2);
@@ -181,6 +209,7 @@
                 getDB().tvTitle.setText("閰掔簿妫�娴�");
                 getDB().clFace.setVisibility(View.GONE);
                 getDB().clCard.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.GONE);
                 getDB().clSjXuan.setVisibility(View.GONE);
                 getDB().clTip1.setVisibility(View.GONE);
                 getDB().clJiu.setVisibility(View.VISIBLE);
@@ -206,8 +235,17 @@
                 //杩�-鍙告満浜鸿劯楠岃瘉
                 getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
                 getDB().clCard.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.GONE);
                 getDB().clFace.setVisibility(View.VISIBLE);
                 setFaceModel(1);
+                break;
+            case 12:
+                //杩�-鍙告満浜鸿劯楠岃瘉
+                getDB().tvTitle.setText("鍙告満韬唤楠岃瘉");
+                getDB().clCard.setVisibility(View.GONE);
+                getDB().clFace.setVisibility(View.GONE);
+                getDB().clZw.setVisibility(View.VISIBLE);
+                setFaceModel(2);
                 break;
             case 8:
                 //杩�-鍙告満鍒峰崱楠岃瘉
@@ -249,15 +287,37 @@
     protected void doRegister(int type, ActionEventData data) {
         switch (type){
             case 1:
-                //鍒囨崲鍒板埛鍗�
                 if(flag==0){
-                    if(status==0){
+                    //鍒囨崲鍒扮鐞嗗憳鍒峰崱
+                    if(status==0||status==10){
                         statusFsm(1);
-                    }else if(status==2){
+                    }else if(status==2||status==11){
                         statusFsm(3);
                     }
                 }else {
+                    //杩�-鍙告満鍒峰崱楠岃瘉
                     statusFsm(8);
+                }
+                break;
+            case 9:
+                //绠$悊鍛樻寚绾归獙璇�
+                statusFsm(10);
+                break;
+            case 10:
+                //鍙告満鎸囩汗楠岃瘉
+                statusFsm(11);
+                break;
+            case 11:
+                //鍒峰崱-->鎸囩汗楠岃瘉
+                if(flag==0){
+                    if(status==1){
+                        statusFsm(10);
+                    }else {
+                        statusFsm(11);
+                    }
+                }else {
+                    //杩�-鍙告満鎸囩汗
+                    statusFsm(12);
                 }
                 break;
             case 2:
@@ -271,9 +331,9 @@
             case 4:
                 //鍒囨崲鍒颁汉鑴�
                 if(flag==0){
-                    if(status==1){
+                    if(status==1||status==10){
                         statusFsm(0);
-                    }else if(status==3){
+                    }else if(status==3||status==11){
                         statusFsm(2);
                     }
                 }else {
@@ -291,7 +351,14 @@
                 //鍙告満ic鍗℃垚鍔�
                 if(flag==0) {
                     //鍙�
-                    statusFsm(4);
+                    if(MApplication.getConfigBean()!=null&&MApplication.getConfigBean().getAlcoholStatus()==1) {
+                        //闈為厭绮炬娴�
+                        startActivity(KeyCabinetActivity.class);
+                        finish();
+                    }else {
+                        //閰掔簿妫�娴�
+                        statusFsm(4);
+                    }
                 }else {
                     //杩�
                     startActivity(KeyCabinetActivity.class);
@@ -306,6 +373,7 @@
                 getDB().message.requestLayout();
                 EventBus.getDefault().post(new HttpEvent("ic鍗�+++++++"+data.getData().get("type").toString()));
                 break;
+
             default:
                 break;
         }
@@ -503,6 +571,7 @@
                     if(new BigDecimal(MApplication.getConfigBean().getCabinetConfigDataVO().getConcentration())
                             .compareTo(resultEvent.getConcentration())>=0){
                         //閰掔簿閫氳繃
+                        getVM().alcoholTestAlarm(resultEvent.getConcentration().toString());
                         getDB().clJiujinOk.setVisibility(View.VISIBLE);
                         handler.sendEmptyMessageDelayed(4,1000);
                     }else {
@@ -645,7 +714,15 @@
                             MApplication.getLoginBean().setMemberId(Integer.parseInt(user.getUserId()));
                             MApplication.getLoginBean().setAuthType(0);
                             //handler.sendEmptyMessageDelayed(8,0);
-                            EventBus.getDefault().post(new FaceStatusChangeEvent(4));
+                            //Toast.makeText(mContext, "鏄惁閰掔簿妫�娴嬶細"+MApplication.getConfigBean().getAlcoholStatus(), Toast.LENGTH_SHORT).show();
+                            if(MApplication.getConfigBean()!=null&&MApplication.getConfigBean().getAlcoholStatus()==1) {
+                                //闈為厭绮炬娴�
+                                startActivity(KeyCabinetActivity.class);
+                                finish();
+                            }else {
+                                //閰掔簿妫�娴�
+                                EventBus.getDefault().post(new FaceStatusChangeEvent(4));
+                            }
                         }else if(status==7){
                             //杩�-鍙告満
                             MApplication.getLoginBean().setMemberId(Integer.parseInt(user.getUserId()));
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationActivity.java
new file mode 100644
index 0000000..0e31a52
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationActivity.java
@@ -0,0 +1,232 @@
+package com.doumee.keyCabinet.ui.face;
+
+import androidx.annotation.Nullable;
+
+import android.app.DownloadManager;
+import android.content.BroadcastReceiver;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Toast;
+
+import com.baidu.idl.main.facesdk.FaceAuth;
+import com.baidu.idl.main.facesdk.callback.Callback;
+import com.doumee.keyCabinet.MApplication;
+import com.doumee.keyCabinet.R;
+import com.doumee.keyCabinet.base.MyBaseActivity;
+import com.doumee.keyCabinet.databinding.OfflineActivationActivityBinding;
+import com.doumee.keyCabinet.event.TimeClockEvent;
+import com.doumee.keyCabinet.utils.LMobileInfo;
+import com.doumee.keyCabinet.utils.update.FileUtil;
+import com.doumee.lib_coremodel.view.ToastView;
+import com.example.datalibrary.utils.FileUtils;
+import com.example.datalibrary.utils.ToastUtils;
+
+import org.greenrobot.eventbus.Subscribe;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+@AndroidEntryPoint
+public class OfflineActivationActivity extends MyBaseActivity<OfflineActivationVM, OfflineActivationActivityBinding> implements View.OnClickListener {
+    private FaceAuth faceAuth;
+    private boolean isDownLoad;
+    String filePath = Environment.getExternalStorageDirectory().getPath()+"/License.zip";
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.offline_activation_activity;
+    }
+
+    @Override
+    public void initView(@Nullable Bundle savedInstanceState) {
+        isToGuild = false;
+        normalConfig();
+        getDB().setModel(getVM());
+    }
+
+    @Override
+    public void initData(@Nullable Bundle savedInstanceState) {
+        getDB().tvId.setText("NO锛�"+ LMobileInfo.getDeviceUniqueId());
+
+        // 澶嶅埗鎸夐挳
+        faceAuth = new FaceAuth();
+        String a = faceAuth.getDeviceId(this);
+        getDB().accreditDeviceTv.setText(a);
+
+        // 闀挎寜鐐瑰嚮澶嶅埗
+        getDB().accreditDeviceTv.setOnLongClickListener(new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View view) {
+                ClipboardManager clipboardManager = (ClipboardManager)
+                        getSystemService(Context.CLIPBOARD_SERVICE);
+                clipboardManager.setText(getDB().accreditDeviceTv.getText());
+
+                ToastUtils.toast(OfflineActivationActivity.this, "deviceID 澶嶅埗鎴愬姛");
+                return false;
+            }
+        });
+
+        getDB().accreditOffBtn.setOnClickListener(this);
+        getDB().btnDown.setOnClickListener(this);
+        setupDownloadManager();
+        setupDownloadReceiver();
+    }
+
+    @Subscribe
+    public void TimeClockEvent(TimeClockEvent e){
+        if(!isFinishing()){
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    updateDownStatus();
+                }
+            });
+        }
+    }
+
+    private void updateDownStatus(){
+        if(isDownLoad){
+            return;
+        }
+        //鍏堟牎楠屾槸鍚︽湁涓嬭浇璺緞
+        if(!TextUtils.isEmpty(MApplication.getConfigBean().getActivateFileUrl())){
+            if(FileUtil.FileIsExist(filePath)) {
+                //鏂囦欢瀛樺湪
+                getDB().btnDown.setText("閲嶆柊涓嬭浇婵�娲绘枃浠�");
+                getDB().btnDown.setClickable(true);
+                getDB().btnDown.setBackgroundResource(R.mipmap.btn_main_normal);
+
+                getDB().accreditOffBtn.setClickable(true);
+                getDB().accreditOffBtn.setBackgroundResource(R.mipmap.btn_main_normal);
+            }else {
+                getDB().btnDown.setText("涓嬭浇婵�娲绘枃浠�");
+                getDB().btnDown.setClickable(true);
+                getDB().btnDown.setBackgroundResource(R.mipmap.btn_main_normal);
+
+                getDB().accreditOffBtn.setClickable(false);
+                getDB().accreditOffBtn.setBackgroundResource(R.mipmap.btn_less_normal);
+            }
+        }else {
+            //鍒犻櫎婵�娲绘枃浠�
+            FileUtils.deleteFile(filePath);
+            getDB().btnDown.setText("寰呭悗鍙颁笂浼犳縺娲绘枃浠�");
+            getDB().btnDown.setClickable(false);
+            getDB().btnDown.setBackgroundResource(R.mipmap.btn_less_normal);
+
+            getDB().accreditOffBtn.setClickable(false);
+            getDB().accreditOffBtn.setBackgroundResource(R.mipmap.btn_less_normal);
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.btn_down:
+                //涓嬭浇鎸夐挳
+                if(isDownLoad){
+                    ToastView.show(MApplication.mContext,"涓嬭浇涓�...");
+                    return;
+                }
+                if(!TextUtils.isEmpty(MApplication.getConfigBean().getActivateFileUrl())){
+                    isDownLoad = true;
+                    startDownload(MApplication.getConfigBean().getActivateFileUrl());
+                }
+                break;
+            // 绂荤嚎婵�娲�
+            case R.id.accredit_offBtn:
+                faceAuth.initLicenseOffLine(this, new Callback() {
+                    @Override
+                    public void onResponse(final int code, final String response) {
+                        if (code == 0) {
+                            runOnUiThread(new Runnable() {
+                                @Override
+                                public void run() {
+                                    // 鎺堟潈鎴愬姛璺宠浆鍔熻兘鍏ュ彛椤甸潰
+                                    getDB().accreditHintTv.setText("");
+                                    finish();
+                                }
+                            });
+                        } else {
+                            runOnUiThread(new Runnable() {
+                                @Override
+                                public void run() {
+                                    if (code == 7) {
+                                        getDB().accreditHintTv.setText("婵�娲诲け璐ワ紝璁惧纭欢鎸囩汗涓嶭icense.zip涓嶇");
+                                    } else if (code == 11) {
+                                        getDB().accreditHintTv.setText("婵�娲诲け璐ワ紝License.zip鏂囦欢瀵瑰簲鐨勫簭鍒楀彿涓嶅湪鏈夋晥鏈熻寖鍥村唴");
+                                    } else if (code == -1) {
+                                        getDB().accreditHintTv.setText("鏈娴嬪埌License.zip鏂囦欢");
+                                    } else if (code == 14) {
+                                        getDB().accreditHintTv.setText("婵�娲诲け璐ワ紝License.zip鏂囦欢瀵瑰簲鐨勫簭鍒楀彿涓嶅湪鏈夋晥鏈熻寖鍥村唴");
+                                    } else if (code == 4) {
+                                        getDB().accreditHintTv.setText("婵�娲诲け璐ワ紝璁惧纭欢鎸囩汗涓嶭icense.zip涓嶇");
+                                    } else {
+                                        getDB().accreditHintTv.setText(code);
+                                    }
+                                }
+                            });
+
+                        }
+                    }
+                });
+                break;
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (downloadReceiver != null) {
+            unregisterReceiver(downloadReceiver);
+        }
+    }
+    private BroadcastReceiver downloadReceiver;
+    private DownloadManager downloadManager;
+    private long downloadId;
+
+    private void setupDownloadManager() {
+        downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
+    }
+
+
+    private void startDownload(String url) {
+        try {
+            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
+
+            // 璁剧疆涓嬭浇鍙傛暟
+            request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
+            request.setTitle("鏂囦欢涓嬭浇");
+            request.setDescription("姝e湪涓嬭浇鏂囦欢...");
+            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+            request.setDestinationInExternalPublicDir("", "License.zip");
+
+            // 寮�濮嬩笅杞�
+            downloadId = downloadManager.enqueue(request);
+            Toast.makeText(mContext, "涓嬭浇宸插紑濮�", Toast.LENGTH_SHORT).show();
+
+        } catch (Exception e) {
+            isDownLoad = false;
+            Toast.makeText(this, "涓嬭浇澶辫触: " + e.getMessage(), Toast.LENGTH_LONG).show();
+        }
+    }
+
+    private void setupDownloadReceiver() {
+        downloadReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive (Context context, Intent intent){
+                long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
+                if (id == downloadId) {
+                    isDownLoad = false;
+                    Toast.makeText(context, "鏂囦欢涓嬭浇瀹屾垚", Toast.LENGTH_LONG).show();
+                }
+            }
+        };
+        registerReceiver(downloadReceiver,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
+    }
+}
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationVM.java
new file mode 100644
index 0000000..d7da6e5
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationVM.java
@@ -0,0 +1,23 @@
+package com.doumee.keyCabinet.ui.face;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.hilt.lifecycle.ViewModelInject;
+
+import com.android.internal.logging.AndroidConfig;
+import com.doumee.lib_coremodel.base.BaseModel;
+import com.doumee.lib_coremodel.base.DataViewModel;
+
+public class OfflineActivationVM extends DataViewModel {
+
+    @ViewModelInject
+    public OfflineActivationVM(@NonNull Application application, BaseModel model) {
+        super(application, model);
+    }
+
+    @Override
+    protected void clickByTypeCommand(int type) {
+        doAction(type);
+    }
+}
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/UserManagerActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/UserManagerActivity.java
index d542ecf..fa4b656 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/UserManagerActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/UserManagerActivity.java
@@ -30,6 +30,7 @@
 import com.doumee.keyCabinet.R;
 import com.doumee.keyCabinet.base.MyBaseActivity;
 import com.doumee.keyCabinet.databinding.UserManagerActivityBinding;
+import com.doumee.keyCabinet.event.HttpEvent;
 import com.doumee.keyCabinet.ui.face.adapter.FaceUserAdapter;
 import com.doumee.keyCabinet.ui.view.TipDialog;
 import com.doumee.keyCabinet.utils.face.model.SingleBaseConfig;
@@ -41,6 +42,8 @@
 import com.example.datalibrary.model.KeyboardsUtils;
 import com.example.datalibrary.model.User;
 import com.example.datalibrary.utils.DensityUtils;
+
+import org.greenrobot.eventbus.EventBus;
 
 import java.util.List;
 
@@ -428,6 +431,12 @@
         }
         if (mSelectCount != 0) {
             isDBLoad = false;
+            String info = "鏁伴噺锛�"+mUserInfoList.size();
+            for(User u:mUserInfoList){
+                String key = u.getUserName()+"-"+u.getGroupId();
+                info+="\n"+key+" :"+u.isChecked()+";";
+            }
+            EventBus.getDefault().post(new HttpEvent(info));
             UserInfoManager.getInstance().deleteUserListInfo(mUserInfoList,
                     mEditTitleSearch.getText().toString() , mUserListListener,
                     loadListener);
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/guide/TestActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/guide/TestActivity.java
index c12cfb3..14d8dac 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/guide/TestActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/guide/TestActivity.java
@@ -8,7 +8,6 @@
 import com.doumee.keyCabinet.R;
 import com.doumee.keyCabinet.base.MyBaseActivity;
 import com.doumee.keyCabinet.databinding.ActivityTestBinding;
-import com.innohi.YNHAPI;
 
 import dagger.hilt.android.AndroidEntryPoint;
 
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java
index ad4c731..debb0ff 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ChangeUrlActivity.java
@@ -46,6 +46,7 @@
     public void initData(@Nullable Bundle savedInstanceState) {
         getDB().etUrl.setText(SpUtil.getString("base_url", Apis.HTTP));
         getDB().etTime.setText(SpUtil.getInt("loop_time",60)+"");
+        getDB().etXj.setText(SpUtil.getString("rbgCameraId","0"));
     }
 
     @Override
@@ -72,11 +73,18 @@
                     ToastView.show(MApplication.mContext,"鎺ュ彛璋冪敤闂撮殧閿欒");
                     return;
                 }
+                String xj = getDB().etXj.getText().toString();
+                if(!"0".equals(xj)&&!"1".equals(xj)){
+                    ToastView.show(MApplication.mContext,"鎽勫儚澶寸紪鍙烽敊璇�");
+                    return;
+                }
+                String oldCameraId = SpUtil.getString("rbgCameraId","0");
+                SpUtil.saveString("rbgCameraId",xj);
                 String oldUrl = SpUtil.getString("base_url", Apis.HTTP);
                 SpUtil.saveString("base_url",url);
                 SpUtil.saveInt("loop_time",time);
                 ToastView.show(MApplication.mContext,"淇濆瓨鎴愬姛");
-                if(!oldUrl.equals(url)){
+                if(!oldUrl.equals(url)||!oldCameraId.equals(xj)){
                     //鎺ュ彛涓嶅悓锛岄噸鏂板惎鍔�
                     restartApp();
                 }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
index 2377446..daaca99 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
@@ -167,6 +167,7 @@
                 //寮�鍚煖闂�
                 getVM().openGridDriver(selectBean);
                 downTime = 60;
+                getDB().tvTitle.setVisibility(View.GONE);
                 break;
             case 2:
                 //getDB().clTip1.setVisibility(View.GONE);
@@ -281,6 +282,12 @@
 
     private SpannableString getErrPhoneText(){
         String phone = MApplication.getConfigBean().getLinkPhone();
+        if(phone==null){
+            String text = "濡傛湁闂璇疯仈绯荤鐞嗗憳";
+            SpannableString styledText = new SpannableString(text);
+            styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip3), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+            return styledText;
+        }
         String text = "濡傛湁闂璇疯仈绯荤鐞嗗憳"+phone;
         SpannableString styledText = new SpannableString(text);
         styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip2), 0, text.length()-phone.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
@@ -473,6 +480,17 @@
                 if(handler.hasMessages(0)){
                     handler.removeMessages(0);
                 }
+                if("1".equals(e.getType())){
+                    //1鍙锋澘
+                    if(!"1".equals(selectBean.getBoardCode())){
+                        return;
+                    }
+                }else if("2".equals(e.getType())){
+                    //2鍙锋澘
+                    if(!"2".equals(selectBean.getBoardCode())){
+                        return;
+                    }
+                }
                 String key = SportUtils.intToHex(Integer.parseInt(selectBean.getBoardCode()))
                         +SportUtils.intToHex(Integer.parseInt(selectBean.getChannelCode()));
                 if(flag==0) {
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetVM.java
index 188f7a9..6f09147 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetVM.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetVM.java
@@ -100,17 +100,20 @@
         OpenGridDriverParam param = new OpenGridDriverParam();
         param.setCabinetId(selectBean.getCabinetId());
         param.setGridId(selectBean.getId());
+        param.setOpenWay(selectBean.getGetKeyWay());
+        param.setCarUseBookId(selectBean.getCarUseBookId());
         param.setMemberId(MApplication.getLoginBean().getMemberId());
         param.setAuthType(MApplication.getLoginBean().getAuthType());
         showLoading(true);
+        EventBus.getDefault().post(new HttpEvent("===>鍙告満寮�闂�-璇锋眰"));
         getRetrofitService(Apis.class).openGridDriver(ParamsUtil.encodeRequestBody(param))
                 .compose(RxUtils.schedulersTransformer())
                 .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                     @Override
                     public void onNext(@NonNull BaseResponse response) {
+                        EventBus.getDefault().post(new HttpEvent("===>鍙告満寮�闂�-杩斿洖"));
                         if(200==response.getCode()){
                             //寮�闂�
-                            EventBus.getDefault().post(new HttpEvent("寮�闂ㄦ帴鍙f垚鍔�"));
                             doAction(2);
                         }else {
                             toast(response.getMessage());
@@ -141,12 +144,13 @@
         param.setMemberId(loginBean.getMemberId());
         param.setGridId(gridDo.getGridId());
         param.setKeyStatus(!TextUtils.isEmpty(gridDo.getCurKeyCode())?1:2);
+        EventBus.getDefault().post(new HttpEvent("===>鍙告満鍏抽棴鏌滄牸-璇锋眰"));
         getRetrofitService(Apis.class).closeGrid(ParamsUtil.encodeRequestBody(param))
                 .compose(RxUtils.schedulersTransformer())
                 .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                     @Override
                     public void onNext(@NonNull BaseResponse response) {
-                        EventBus.getDefault().post(new HttpEvent("鍏抽棴鏌滄牸鎺ュ彛璋冪敤鎴愬姛"));
+                        EventBus.getDefault().post(new HttpEvent("===>鍙告満鍏抽棴鏌滄牸-杩斿洖"));
                     }
 
                     @Override
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
index 7ab3232..4e6109c 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
@@ -37,12 +37,13 @@
 import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
 import com.doumee.keyCabinet.event.TimeClockEvent;
 import com.doumee.keyCabinet.ui.keyCabinet.adapter.ManageCabinetRcvAdapter;
+import com.doumee.keyCabinet.utils.MCUtils;
 import com.doumee.keyCabinet.utils.i485.SportUtils;
 import com.doumee.lib_coremodel.bean.event.ActionEventData;
 import com.doumee.lib_coremodel.util.RecyclerHelp;
 import com.doumee.lib_coremodel.util.StringUtil;
 import com.example.datalibrary.db.DBManager;
-import com.innohi.YNHAPI;
+import com.mc.enjoysdk.McSystemUi;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
@@ -110,8 +111,8 @@
             @Override
             public boolean onLongClick(View v) {
                 //鍙互涓嬫媺
-                YNHAPI mAPI = YNHAPI.getInstance();
-                mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
+                McSystemUi mcSystemUi = McSystemUi.getInstance(ManageCabinetActivity.this);
+                MCUtils.show(mcSystemUi);
                 return true;
             }
         });
@@ -673,8 +674,25 @@
                 if(!isFail){
                     if(copyMap.containsKey(gridDo.getGridKey())){
                         //鍏抽棬鎴愬姛
-                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"闂ㄥ叧闂垚鍔�***************************>鐩爣锛�"+gridDo.getKeyCode()+",褰撳墠锛�"+gridDo.getCurKeyCode()));
-                        getVM().closeGrid(gridDo);
+                        boolean isSend = false;
+                        String bh = gridDo.getGridKey().substring(0,2);
+                        if("1".equals(e.getType())){
+                            //1鍙锋澘
+                            if("01".equals(bh)){
+                                isSend = true;
+                            }
+                        }else if("2".equals(e.getType())){
+                            //2鍙锋澘
+                            if("02".equals(bh)){
+                                isSend = true;
+                            }
+                        }else {
+                            isSend = true;
+                        }
+                        if(isSend) {
+                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date()) + "闂ㄥ叧闂垚鍔�***************************>鐩爣锛�" + gridDo.getKeyCode() + ",褰撳墠锛�" + gridDo.getCurKeyCode()));
+                            getVM().closeGrid(gridDo);
+                        }
                     }
                 }
             }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java
index 780a18c..40d7828 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java
@@ -289,7 +289,7 @@
         param.setMemberId(loginBean.getMemberId());
         param.setGridId(gridDo.getGridId());
         param.setKeyStatus(!TextUtils.isEmpty(gridDo.getCurKeyCode())?1:2);
-        toast(gridDo.getGridKey()+"鍏抽棴锛屽綋鍓嶉挜鍖欏彿锛�"+gridDo.getCurKeyCode());
+        //toast(gridDo.getGridKey()+"鍏抽棴锛屽綋鍓嶉挜鍖欏彿锛�"+gridDo.getCurKeyCode());
         getRetrofitService(Apis.class).closeGrid(ParamsUtil.encodeRequestBody(param))
                 .compose(RxUtils.schedulersTransformer())
                 .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java
index 2a1ffe1..0297682 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java
@@ -17,8 +17,9 @@
 import com.doumee.keyCabinet.databinding.ManageLoginActivityBinding;
 import com.doumee.keyCabinet.event.TimeClockEvent;
 import com.doumee.keyCabinet.utils.LMobileInfo;
+import com.doumee.keyCabinet.utils.MCUtils;
 import com.doumee.lib_coremodel.bean.event.ActionEventData;
-import com.innohi.YNHAPI;
+import com.mc.enjoysdk.McSystemUi;
 
 import org.greenrobot.eventbus.Subscribe;
 
@@ -51,8 +52,8 @@
             public boolean onLongClick(View v) {
                 if(MApplication.getConfigBean().getId()==null){
                     //鍙互涓嬫媺
-                    YNHAPI mAPI = YNHAPI.getInstance();
-                    mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
+                    McSystemUi mcSystemUi = McSystemUi.getInstance(ManageLoginActivity.this);
+                    MCUtils.show(mcSystemUi);
                     return true;
                 }
                 return false;
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
index 2584140..52a2407 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -14,6 +14,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.serialport.SerialPortFinder;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.TextUtils;
@@ -69,6 +70,7 @@
 import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
 import com.doumee.keyCabinet.event.TimeClockEvent;
 import com.doumee.keyCabinet.ui.face.ActivationActivity;
+import com.doumee.keyCabinet.ui.face.ChoseActivationActivity;
 import com.doumee.keyCabinet.ui.face.FaceActivity;
 import com.doumee.keyCabinet.ui.keyCabinet.ChangeUrlActivity;
 import com.doumee.keyCabinet.ui.keyCabinet.KeyCabinetActivity;
@@ -84,6 +86,7 @@
 import com.doumee.keyCabinet.utils.CircularQueue;
 import com.doumee.keyCabinet.utils.CrashHandler;
 import com.doumee.keyCabinet.utils.LMobileInfo;
+import com.doumee.keyCabinet.utils.MCUtils;
 import com.doumee.keyCabinet.utils.TimeUtils;
 import com.doumee.keyCabinet.utils.face.FaceSDKManager;
 import com.doumee.keyCabinet.utils.face.FaceUtils;
@@ -107,13 +110,16 @@
 import com.doumee.lib_coremodel.util.StringUtil;
 import com.doumee.lib_coremodel.view.ToastView;
 import com.example.datalibrary.api.FaceApi;
+import com.example.datalibrary.db.DBManager;
 import com.example.datalibrary.listener.DBLoadListener;
 import com.example.datalibrary.listener.SdkInitListener;
 import com.example.datalibrary.model.ImportFeatureResult;
 import com.example.datalibrary.model.User;
 import com.example.datalibrary.utils.ToastUtils;
 import com.example.datalibrary.view.PreviewTexture;
-import com.innohi.YNHAPI;
+import com.mc.enjoysdk.McHome;
+import com.mc.enjoysdk.McSystemUi;
+import com.mc.enjoysdk.transform.McSystemUiFlag;
 import com.yanzhenjie.permission.runtime.Permission;
 
 import org.greenrobot.eventbus.EventBus;
@@ -160,6 +166,8 @@
     private int downCount = 0;
     private Long lastDownTime;
     private Long showTime;
+    private McSystemUi mcSystemUi;
+    private McHome mcHome;
 
     private Handler handler = new Handler(){
         @Override
@@ -219,6 +227,8 @@
         startService(intent2);*/
         getPermission();
         Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId());
+        mcSystemUi = McSystemUi.getInstance(this);
+        mcHome = McHome.getInstance(this);
     }
 
     private void initM(){
@@ -253,6 +263,7 @@
             @Override
             public void onChanged(List<FaceUserBean> beans) {
                 //鏇存柊浜鸿劯鏁版嵁
+                getVM().addInfo("鏇存柊浜鸿劯鏁版嵁======銆媌eans = "+beans);
                 if(beans!=null&&beans.size()>0){
                     initModel(beans);
                 }
@@ -324,8 +335,10 @@
                 }else {
                     getDB().nsv.setVisibility(View.VISIBLE);
                 }
-                YNHAPI mAPI = YNHAPI.getInstance();
-                mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
+                //鏄剧ず鐘舵�佹爮
+                mcSystemUi.temporarilySwitchStatusBar(true);
+                //鏄剧ず瀵艰埅鏍�
+                mcSystemUi.temporarilySwitchNavigation(true);
             }
         });
         upErrInfo();
@@ -340,6 +353,7 @@
                     }
                     setJiuConfig();
                     initPort();
+                    EventBus.getDefault().post(new GetFacesEvent());
                 }
             }
         });
@@ -458,6 +472,12 @@
 
     private SpannableString getErrPhoneText(){
         String phone = MApplication.getConfigBean().getLinkPhone();
+        if(phone==null){
+            String text = "濡傛湁闂璇疯仈绯荤鐞嗗憳";
+            SpannableString styledText = new SpannableString(text);
+            styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip3), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+            return styledText;
+        }
         String text = "濡傛湁闂璇疯仈绯荤鐞嗗憳"+phone;
         SpannableString styledText = new SpannableString(text);
         styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip3), 0, text.length()-phone.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
@@ -470,9 +490,9 @@
     protected void onResume() {
         super.onResume();
         isShowing = true;
-        YNHAPI mAPI = YNHAPI.getInstance();
-        mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.ALWAYS_INVISIBLE);
-        mAPI.setBootLaunchApk("com.doumee.keyCabinet", true);
+        getVM().setSubmit(true);
+        MCUtils.hind(mcSystemUi);
+        mcHome.setHomePackage("com.doumee.keyCabinet");
         showTime = System.currentTimeMillis();
         if(!isFaceOk) {
             initLicense();
@@ -512,7 +532,10 @@
         if (future != null && !future.isDone()) {
             future.cancel(true);
         }
-        FaceApi.getInstance().cleanRecords();
+        if(isFaceOk) {
+            //婵�娲讳簡鎵嶅鐞�
+            FaceApi.getInstance().cleanRecords();
+        }
         handler.removeCallbacksAndMessages(null);
         handler = null;
         faceHandler.removeCallbacksAndMessages(null);
@@ -543,7 +566,9 @@
 
     @Subscribe
     public void GetFacesEvent(GetFacesEvent event){
+        getVM().addInfo("鏌ヨ浜鸿劯鏁版嵁======銆�");
         if(!isFinishing()&&!isUpdatingFace){
+            getVM().addInfo("鏌ヨ浜鸿劯鏁版嵁======銆媔sDBLoad = "+isDBLoad);
             if(isDBLoad){
                 isNeedUpdateFace = false;
                 //鏌ヨ浜鸿劯
@@ -577,7 +602,7 @@
                         /*
                          *瑕佹墽琛岀殑鎿嶄綔*/
 
-                        startActivity(new Intent(mContext, ActivationActivity.class));
+                        startActivity(new Intent(mContext, ChoseActivationActivity.class));
                     }
                 };
                 Timer timer = new Timer();
@@ -639,10 +664,10 @@
                             @Override
                             public void run() {
                                 FaceApi.getInstance().setUsers(users);
+                                isDBLoad = true;
                                 initFaceSDKManager(null);
                                 if (successCount > 5000 || successCount == 0) {
                                     getDB().progressGroup.setVisibility(View.GONE);
-                                    isDBLoad = true;
                                     isFaceOk = true;
                                 }
                             }
@@ -688,8 +713,10 @@
 
     private void initModel(List<FaceUserBean> userBeans) {
         if (com.example.datalibrary.manager.FaceSDKManager.initStatus == com.example.datalibrary.manager.FaceSDKManager.SDK_MODEL_LOAD_SUCCESS) {
+            getVM().addInfo("鏇存柊浜鸿劯===銆嬪紑濮嬫洿鏂�");
             waitUpdate(userBeans);
         }else {
+            getVM().addInfo("鏇存柊浜鸿劯===銆嬪垵濮嬪寲");
             initFaceSDKManager(userBeans);
         }
     }
@@ -745,6 +772,7 @@
         super.onPause();
         showTime = null;
         isShowing = false;
+        getVM().setSubmit(false);
     }
 
     private int finishCount;
@@ -778,11 +806,9 @@
         }
     };
 
-    private void waitUpdate(List<FaceUserBean> userBeans){
-        if(isUpdatingFace){
-            //姝e湪鏇存柊
-            waitBeans.addAll(userBeans);
-        }else {
+    private UserInfoManager.UserInfoListener mUserListListener = new UserInfoManager.UserInfoListener(){
+        @Override
+        public void userListQuerySuccess(String userName, List<User> listUserInfo) {
             selectBeans.clear();
             selectBeans.addAll(waitBeans);
             waitBeans.clear();
@@ -800,25 +826,37 @@
             //鍒犻櫎涓嶅瓨鍦ㄧ敤鎴�
             List<User> users = FaceApi.getInstance().getAllUserList();
             List<User> dels = new ArrayList<>();
+            StringBuilder sb = new StringBuilder();
             for(User u:users){
                 String key = u.getUserId()+"_"+u.getGroupId();
                 if(!uMap.containsKey(key)){
+                    u.setChecked(true);
                     dels.add(u);
+                    if(sb.length()>0){
+                        sb.append(",");
+                    }
+                    sb.append(u.getUserName());
                 }
             }
+            getVM().addInfo("鏇存柊浜鸿劯銆嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨�嬨��");
             if(dels.size()>0){
-                UserInfoManager.getInstance().deleteUserListInfo(dels,
-                        "", new UserInfoManager.UserInfoListener() {
+                getVM().addInfo("鍑嗗鍒犻櫎鐢ㄦ埛锛�"+sb.toString());
+                UserInfoManager.getInstance().deleteUserListInfo(users,
+                        "1", new UserInfoManager.UserInfoListener() {
                             @Override
                             public void userListDeleteSuccess() {
                                 // 鐢ㄦ埛鍒楄〃鍒犻櫎鎴愬姛
                                 faceHandler.sendEmptyMessage(0);
+                                getVM().addInfo("鍒犻櫎鐢ㄦ埛鎴愬姛锛�");
                             }
 
                             @Override
                             public void userListDeleteFailure(String message) {
                                 // 鐢ㄦ埛鍒楄〃鍒犻櫎澶辫触
                                 faceHandler.sendEmptyMessage(0);
+                                getVM().addInfo("鍒犻櫎鐢ㄦ埛澶辫触锛�"+message);
+
+                                getVM().addInfo("鍒犻櫎鐢ㄦ埛鍒楄〃锛�"+sb.toString());
                             }
                         },
                         new DBLoadListener() {
@@ -846,11 +884,41 @@
                 faceHandler.sendEmptyMessage(0);
             }
         }
+
+        @Override
+        public void userListQueryFailure(String message) {
+
+        }
+
+        @Override
+        public void userListDeleteSuccess() {
+
+        }
+
+        @Override
+        public void userListDeleteFailure(String message) {
+
+        }
+    };
+
+    private List<FaceUserBean> userBeans = new ArrayList<>();
+    private void waitUpdate(List<FaceUserBean> userBeans){
+        if(isUpdatingFace){
+            //姝e湪鏇存柊
+            waitBeans.addAll(userBeans);
+            getVM().addInfo("姝e湪鏇存柊銆佺瓑寰� 銆娿�娿�娿�娿�娿�娿�娿��");
+        }else {
+            getVM().addInfo("鍒濆鍖栦汉鑴稿簱 銆娿�娿�娿�娿�娿�娿�娿��");
+            com.example.datalibrary.manager.FaceSDKManager.getInstance().initDataBases(MainActivity.this);
+            this.userBeans.clear();
+            this.userBeans.addAll(userBeans);
+            UserInfoManager.getInstance().getUserListInfo(null, mUserListListener);
+        }
     }
 
     private int repeatCount = 0;
     private void updateFace(FaceUserBean bean){
-        Timber.d("==UpdatingFace==>瀹屾垚鏁伴噺 "+finishCount);
+        //getVM().addInfo("==UpdatingFace==>瀹屾垚鏁伴噺 " + finishCount);
         if (TextUtils.isEmpty(bean.getFaceImg())||bean.getFaceImg().endsWith("null")) {
             finishCount++;
             faceHandler.sendEmptyMessage(0);
@@ -959,12 +1027,14 @@
             isSave = FaceApi.getInstance().registerUserIntoDBmanager(newDo.getGroupId(),
                     newDo.getUserId(), newDo.getUserName(), newDo.getImageName(), newDo.getUserInfo(), newDo.getFeature());
             //System.out.println("==isOk==>淇濆瓨鎴愬姛");
+            //getVM().addInfo("鏂板浜鸿劯==銆�"+newDo.getUserName()+"   缁撴灉锛�"+isSave);
         } else {
             //鏇存柊
             user.setUserName(newDo.getUserName());
             user.setImageName(newDo.getImageName());
             user.setFeature(newDo.getFeature());
             isSave = FaceApi.getInstance().userUpdateOnly(user);
+            //getVM().addInfo("鏇存柊浜鸿劯==銆�"+newDo.getUserName()+"   缁撴灉锛�"+isSave);
             //System.out.println("==isOk==>鏇存柊鎴愬姛");
         }
 
@@ -1088,7 +1158,7 @@
         SingleBaseConfig.getBaseConfig().setRBGCameraId(index);
         SingleBaseConfig.getBaseConfig().setRgbRevert(true);
         SingleBaseConfig.getBaseConfig().setRgbDetectDirection(90);
-        SingleBaseConfig.getBaseConfig().setRgbVideoDirection(270);
+        SingleBaseConfig.getBaseConfig().setRgbVideoDirection(90);
         GateConfigUtils.modityJson();
         RegisterConfigUtils.modityJson();
     }
@@ -1178,7 +1248,6 @@
                 getVM().devLogin();
                 getPermission();
                 getVM().devHeart();
-                EventBus.getDefault().post(new GetFacesEvent());
             }else {
                 loopDownCount--;
             }
@@ -1546,7 +1615,7 @@
         }
 
         getVM().updateGrids(updateList);
-        EventBus.getDefault().post(new KeyResultEvent());
+        EventBus.getDefault().post(new KeyResultEvent(bh+""));
     }
 
     private SerialPortModel jiuPort;
@@ -1610,20 +1679,28 @@
                 return;
             }
             runOnUiThread(() -> {
-                getVM().addInfo("鑾峰彇鍒伴棬鏁版嵁:" + SportUtils.bytesToHexSimple(bytes));
+                getVM().addInfo("鑾峰彇鍒版暟鎹�:" + SportUtils.bytesToHexSimple(bytes));
             });
+            String data = SportUtils.bytesToHexSimple(bytes);
             if(startIndex==1){
-                gridPath = path;
-                getVM().addInfo("璁剧疆闂ㄤ覆鍙h矾寰�:" + path);
-                SpUtil.saveString("port_grid",path);
+                if(data.toLowerCase().startsWith("80")){
+                    gridPath = path;
+                    getVM().addInfo("璁剧疆闂ㄤ覆鍙h矾寰�:=====XXXXX===>" + path);
+                    SpUtil.saveString("port_grid",path);
+                }
             }else if(startIndex==2){
-                keyPath = path;
-                getVM().addInfo("璁剧疆閽ュ寵涓插彛璺緞:" + path);
-                SpUtil.saveString("port_key",path);
+                if(data.toLowerCase().startsWith("cc")){
+                    keyPath = path;
+                    getVM().addInfo("璁剧疆閽ュ寵涓插彛璺緞:====XXXX====>" + path);
+                    SpUtil.saveString("port_key",path);
+                }
             }else if(startIndex==3){
-                jiuPath = path;
-                getVM().addInfo("璁剧疆閰掔簿涓插彛璺緞:" + path);
-                SpUtil.saveString("port_jiu",path);
+                String data2 = new String(bytes);
+                if(data2.toLowerCase().startsWith("mic")) {
+                    jiuPath = path;
+                    getVM().addInfo("璁剧疆閰掔簿涓插彛璺緞:====XXXX====>" + path);
+                    SpUtil.saveString("port_jiu", path);
+                }
             }
         }
     };
@@ -1642,8 +1719,8 @@
             switch (msg.what){
                 case 0:
                     if(index>=1&&!checkEnd()){
-                        path = ports.get(index);
                         index--;
+                        path = ports.get(index);
                         portHandler.sendEmptyMessage(4);
                     }else if(checkEnd()){
                         initPort();
@@ -1747,90 +1824,97 @@
     private boolean isInitPort;
     //鍒濆鍖栦覆鍙�
     private void initPort(){
-        //SpUtil.setString("port_grid","/dev/ttyS7");
-        //SpUtil.setString("port_key","/dev/ttyS1");
-        //SpUtil.setString("port_jiu","/dev/ttyS2");
-        gridPath = SpUtil.getString("port_grid");
-        getVM().addInfo("闂ㄤ覆鍙i摼鎺ワ細"+gridPath);
-        keyPath = SpUtil.getString("port_key");
-        getVM().addInfo("閽ュ寵涓插彛閾炬帴锛�"+keyPath);
-        jiuPath = SpUtil.getString("port_jiu");
-        getVM().addInfo("閰掔簿涓插彛閾炬帴锛�"+jiuPath);
-        if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))&&
-                !TextUtils.isEmpty(SpUtil.getString("port_key"))&&
-                !TextUtils.isEmpty(SpUtil.getString("port_jiu"))){
-            if(isInitPort){
-                return;
-            }
-            xhCount=0;
-            closePort(chosePort);
-            if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))){
-                String path = SpUtil.getString("port_grid");
-                closePort(gridPort);
-                getVM().addInfo("闂ㄤ覆鍙i摼鎺ワ細"+path);
-                gridPort = new SerialPortModel(path,9600 ,8
-                        ,1 , 0,gridReadObserver);
-                boolean isSucc = gridPort.open();
-                if(isSucc) {
-                    isInitPort = true;
-                    getVM().addInfo("闂ㄤ覆鍙i摼鎺ユ垚鍔燂細"+path);
-                    String msg = isSucc ? "鎴愬姛" : "澶辫触";
-                    //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
-                    gridPort.startRead();
-                    //鏌ヨ鎵�鏈夋煖鏍奸棬淇℃伅
-                   checkGridStatus(300);
-                }else {
-                    getVM().addInfo("闂ㄤ覆鍙i摼鎺ュけ璐ワ細"+path);
+        try {
+            /*SpUtil.setString("port_grid","/dev/ttyS0");
+            SpUtil.setString("port_key","/dev/ttyS4");
+            SpUtil.setString("port_jiu","/dev/ttyS9");*/
+
+            gridPath = SpUtil.getString("port_grid");
+            getVM().addInfo("闂ㄤ覆鍙i摼鎺ワ細"+gridPath);
+            keyPath = SpUtil.getString("port_key");
+            getVM().addInfo("閽ュ寵涓插彛閾炬帴锛�"+keyPath);
+            jiuPath = SpUtil.getString("port_jiu");
+            getVM().addInfo("閰掔簿涓插彛閾炬帴锛�"+jiuPath);
+            if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))&&
+                    !TextUtils.isEmpty(SpUtil.getString("port_key"))&&
+                    !TextUtils.isEmpty(SpUtil.getString("port_jiu"))){
+                if(isInitPort){
+                    return;
                 }
-            }
-            if(!TextUtils.isEmpty(SpUtil.getString("port_key"))){
-                String path = SpUtil.getString("port_key");
-                closePort(keyPort);
-                keyPort = new SerialPortModel(path,115200 ,8
-                        ,1 , 0,keyReadObserver);
-                boolean isSucc = keyPort.open();
-                if(isSucc) {
-                    isInitPort = true;
-                    getVM().addInfo("閽ュ寵涓插彛閾炬帴鎴愬姛锛�"+path);
-                    String msg = isSucc ? "鎴愬姛" : "澶辫触";
-                    //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
-                    keyPort.startRead();
-                    checkKeyStatus(1500);
-                }else {
-                    getVM().addInfo("閽ュ寵涓插彛閾炬帴澶辫触锛�"+path);
+                xhCount=0;
+                closePort(chosePort);
+                if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))){
+                    String path = SpUtil.getString("port_grid");
+                    closePort(gridPort);
+                    getVM().addInfo("闂ㄤ覆鍙i摼鎺ワ細"+path);
+                    gridPort = new SerialPortModel(path,9600 ,8
+                            ,1 , 0,gridReadObserver);
+                    boolean isSucc = gridPort.open();
+                    if(isSucc) {
+                        isInitPort = true;
+                        getVM().addInfo("闂ㄤ覆鍙i摼鎺ユ垚鍔燂細"+path);
+                        String msg = isSucc ? "鎴愬姛" : "澶辫触";
+                        //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
+                        gridPort.startRead();
+                        //鏌ヨ鎵�鏈夋煖鏍奸棬淇℃伅
+                        checkGridStatus(300);
+                    }else {
+                        getVM().addInfo("闂ㄤ覆鍙i摼鎺ュけ璐ワ細"+path);
+                    }
                 }
-            }
-            if(!TextUtils.isEmpty(SpUtil.getString("port_jiu"))){
-                String path = SpUtil.getString("port_jiu");
-                closePort(jiuPort);
-                jiuPort = new SerialPortModel(path,9600 ,8
-                        ,1 , 0,jiuReadObserver);
-                boolean isSucc = jiuPort.open();
-                if(isSucc) {
-                    isInitPort = true;
-                    getVM().addInfo("閰掔簿涓插彛閾炬帴鎴愬姛锛�"+path);
-                    String msg = isSucc ? "鎴愬姛" : "澶辫触";
-                    //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
-                    jiuPort.startRead();
-                }else {
-                    getVM().addInfo("閰掔簿涓插彛閾炬帴澶辫触锛�"+path);
+                if(!TextUtils.isEmpty(SpUtil.getString("port_key"))){
+                    String path = SpUtil.getString("port_key");
+                    closePort(keyPort);
+                    keyPort = new SerialPortModel(path,115200 ,8
+                            ,1 , 0,keyReadObserver);
+                    boolean isSucc = keyPort.open();
+                    if(isSucc) {
+                        isInitPort = true;
+                        getVM().addInfo("閽ュ寵涓插彛閾炬帴鎴愬姛锛�"+path);
+                        String msg = isSucc ? "鎴愬姛" : "澶辫触";
+                        //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
+                        keyPort.startRead();
+                        checkKeyStatus(1500);
+                    }else {
+                        getVM().addInfo("閽ュ寵涓插彛閾炬帴澶辫触锛�"+path);
+                    }
                 }
-            }
-        }else {
-            if(xhCount>2){
-                return;
-            }
-            xhCount++;
-            ports = SportUtils.getSerialPortPaths(this);
-            if(ports==null){
-                getVM().addInfo("鏈煡璇㈠埌涓插彛鍒楄〃");
+                if(!TextUtils.isEmpty(SpUtil.getString("port_jiu"))){
+                    String path = SpUtil.getString("port_jiu");
+                    closePort(jiuPort);
+                    jiuPort = new SerialPortModel(path,9600 ,8
+                            ,1 , 0,jiuReadObserver);
+                    boolean isSucc = jiuPort.open();
+                    if(isSucc) {
+                        isInitPort = true;
+                        getVM().addInfo("閰掔簿涓插彛閾炬帴鎴愬姛锛�"+path);
+                        String msg = isSucc ? "鎴愬姛" : "澶辫触";
+                        //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
+                        jiuPort.startRead();
+                    }else {
+                        getVM().addInfo("閰掔簿涓插彛閾炬帴澶辫触锛�"+path);
+                    }
+                }
             }else {
-                getVM().addInfo("涓插彛鍒楄〃锛�"+ports.size());
+                if(xhCount>2){
+                    return;
+                }
+                xhCount++;
+                ports = SportUtils.getSerialPortPaths(this);
+                if(ports==null){
+                    getVM().addInfo("鏈煡璇㈠埌涓插彛鍒楄〃");
+                }else {
+                    getVM().addInfo("涓插彛鍒楄〃锛�"+ports.size());
+                }
+                if(ports.size()>0){
+                    index = ports.size();
+                    portHandler.sendEmptyMessage(0);
+                }
             }
-            if(ports.size()>0){
-                index = ports.size()-1;
-                portHandler.sendEmptyMessage(0);
-            }
+        }catch (RuntimeException e){
+            Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_SHORT).show();
+        }catch (Exception e){
+            Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_SHORT).show();
         }
     }
 
@@ -1948,17 +2032,17 @@
 
     private boolean checkEnd(){
         if(TextUtils.isEmpty(gridPath)){
-            getVM().addInfo("闂ㄩ敊璇�");
+            getVM().addInfo("闂ㄩ敊璇�<<<<<<<<<<<<<<<<<<<");
             startIndex=0;
             return false;
         }
         if(TextUtils.isEmpty(keyPath)){
-            getVM().addInfo("閽ュ寵閿欒");
+            getVM().addInfo("閽ュ寵閿欒<<<<<<<<<<<<<<<<<<<");
             startIndex=1;
             return false;
         }
         if(TextUtils.isEmpty(jiuPath)){
-            getVM().addInfo("閰掔簿閿欒");
+            getVM().addInfo("閰掔簿閿欒<<<<<<<<<<<<<<<<<<<");
             startIndex=2;
             return false;
         }
@@ -2034,7 +2118,6 @@
             if(handler.hasMessages(2)){
                 handler.removeMessages(2);
             }
-
             HashMap<String,String> copyMap = new HashMap<>();
             copyMap.putAll(closeMap);
             closeMap.clear();
@@ -2071,8 +2154,25 @@
                     }
                     if(!isFail){
                         //鍏抽棬鎴愬姛
-                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"闂ㄥ叧闂垚鍔�***************************>鐩爣锛�"+gridDo.getKeyCode()+",褰撳墠锛�"+gridDo.getCurKeyCode()));
-                        getVM().closeGrid(gridDo);
+                        boolean isSend = false;
+                        String bh = gridDo.getGridKey().substring(0,2);
+                        if("1".equals(e.getType())){
+                            //1鍙锋澘
+                            if("01".equals(bh)){
+                                isSend = true;
+                            }
+                        }else if("2".equals(e.getType())){
+                            //2鍙锋澘
+                            if("02".equals(bh)){
+                                isSend = true;
+                            }
+                        }else {
+                            isSend = true;
+                        }
+                        if(isSend) {
+                            EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date()) + "闂ㄥ叧闂垚鍔�***************************>鐩爣锛�" + gridDo.getKeyCode() + ",褰撳墠锛�" + gridDo.getCurKeyCode()));
+                            getVM().closeGrid(gridDo);
+                        }
                     }
                 }
             }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java
index 40f82bc..39ca636 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainVM.java
@@ -13,30 +13,24 @@
 import com.doumee.keyCabinet.bean.CabinetFaceBean;
 import com.doumee.keyCabinet.bean.DevConfigBean;
 import com.doumee.keyCabinet.bean.FaceUserBean;
-import com.doumee.keyCabinet.bean.KeyCabinetBean;
 import com.doumee.keyCabinet.bean.LoginBean;
 import com.doumee.keyCabinet.bean.ManageKeyCabinetBean;
 import com.doumee.keyCabinet.dao.CabinetGridDo;
 import com.doumee.keyCabinet.dao.DaoManager;
-import com.doumee.keyCabinet.event.DevConfigEvent;
 import com.doumee.keyCabinet.event.HttpEvent;
 import com.doumee.keyCabinet.http.Apis;
 import com.doumee.keyCabinet.http.param.BaseResponse;
 import com.doumee.keyCabinet.http.param.CloseGridParam;
 import com.doumee.keyCabinet.http.param.DevErrInfoParam;
-import com.doumee.keyCabinet.http.param.DevLoginParam;
-import com.doumee.keyCabinet.http.param.FaceUserParam;
 import com.doumee.keyCabinet.http.param.RequestBaseObject;
+import com.doumee.keyCabinet.http.param.SyncGridDataParam;
 import com.doumee.keyCabinet.http.param.TimeOutUnCloseAlarmParam;
-import com.doumee.keyCabinet.utils.BraceletLogUtils;
 import com.doumee.keyCabinet.utils.LMobileInfo;
-import com.doumee.keyCabinet.utils.LanguageUtil;
 import com.doumee.keyCabinet.utils.ParamsUtil;
 import com.doumee.keyCabinet.utils.i485.SportUtils;
 import com.doumee.lib_coremodel.base.BaseModel;
 import com.doumee.lib_coremodel.base.DataViewModel;
 import com.doumee.lib_coremodel.http.rxJava.SimpleObserver;
-import com.doumee.lib_coremodel.http.utils.GsonTools;
 import com.doumee.lib_coremodel.http.utils.RxUtils;
 import com.doumee.lib_coremodel.util.SpUtil;
 import com.doumee.lib_coremodel.util.StringUtil;
@@ -48,9 +42,6 @@
 import java.util.HashMap;
 import java.util.List;
 
-import okhttp3.Headers;
-import retrofit2.Response;
-
 public class MainVM extends DataViewModel {
     public ObservableField<String> dayObs = new ObservableField<>("");
     public ObservableField<String> timeObs = new ObservableField<>("");
@@ -58,6 +49,12 @@
 
     private MutableLiveData<List<FaceUserBean>> faceLD = new MutableLiveData<>();
     private MutableLiveData<DevConfigBean> confidLD = new MutableLiveData<>();
+
+    private boolean isSubmit = false;
+
+    public void setSubmit(boolean submit) {
+        isSubmit = submit;
+    }
 
     @ViewModelInject
     public MainVM(@NonNull Application application, BaseModel model) {
@@ -80,6 +77,7 @@
                         if(200==response.getCode()){
                             if(response.getData()!=null){
                                 MApplication.saveConfigBean(response.getData());
+                                EventBus.getDefault().post(new HttpEvent("閰掔簿妫�娴嬪紑鍏筹細"+response.getData().getAlcoholStatus()));
                                 confidLD.setValue(response.getData());
                                 if(response.getData().getCabinetGridInfoVOList()!=null){
                                     updateDao(response.getData().getCabinetGridInfoVOList());
@@ -114,6 +112,7 @@
         }
         List<CabinetGridDo> addList = new ArrayList<>();
         List<CabinetGridDo> updateList = new ArrayList<>();
+        List<SyncGridDataParam.GridDTO> errList = new ArrayList<>();
         for(ManageKeyCabinetBean bean:beans){
             String key = SportUtils.intToHex(Integer.parseInt(bean.getBoardCode()))+SportUtils.intToHex(Integer.parseInt(bean.getChannelCode()));
             if(oldMap.containsKey(key)){
@@ -129,6 +128,13 @@
                 gridDo.setWorkingStatus(bean.getWorkingStatus());
                 updateList.add(gridDo);
                 oldMap.remove(key);
+                if(isSubmit&&!isCheck(gridDo.getKeyCode(),gridDo.getCurKeyCode())){
+                    SyncGridDataParam.GridDTO errDo = new SyncGridDataParam.GridDTO();
+                    errDo.setActualLable(gridDo.getCurKeyCode());
+                    errDo.setBoardCode(bean.getBoardCode());
+                    errDo.setChannelCode(bean.getChannelCode());
+                    errList.add(errDo);
+                }
             }else {
                 //鏂板
                 CabinetGridDo gridDo = new CabinetGridDo();
@@ -165,6 +171,20 @@
             }
             DaoManager.getCabinetGridDao().update(upList);
         }
+        if(errList.size()>0){
+            syncGridData(errList);
+        }
+    }
+
+    private boolean isCheck(String v1,String v2){
+        if(TextUtils.isEmpty(v1)&&TextUtils.isEmpty(v2)){
+            return true;
+        }else if(TextUtils.isEmpty(v1)&&!TextUtils.isEmpty(v2)){
+            return false;
+        }else if(!TextUtils.isEmpty(v1)&&TextUtils.isEmpty(v2)){
+            return false;
+        }
+        return v1.equals(v2);
     }
 
     public void devHeart(){
@@ -191,12 +211,45 @@
                 });
     }
 
+    public void syncGridData(List<SyncGridDataParam.GridDTO> errList){
+        SyncGridDataParam param = new SyncGridDataParam();
+        param.setCode(LMobileInfo.getDeviceUniqueId());
+        param.setGridDTOList(errList);
+        StringBuilder sb = new StringBuilder();
+        for(SyncGridDataParam.GridDTO d:errList){
+            if(sb.length()>0){
+                sb.append(",");
+            }
+            sb.append(d.getBoardCode()+"_"+d.getChannelCode()+":"+d.getActualLable());
+        }
+        EventBus.getDefault().post(new HttpEvent("涓婃姤閿欒閽ュ寵淇℃伅===銆�"+sb.toString()));
+        getRetrofitService(Apis.class).syncGridData(ParamsUtil.encodeRequestBody(param))
+                .compose(RxUtils.schedulersTransformer())
+                .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
+                    @Override
+                    public void onNext(@NonNull BaseResponse response) {
+
+                    }
+
+                    @Override
+                    public void onError(@NonNull Throwable e) {
+
+                    }
+
+                    @Override
+                    public void onComplete() {
+
+                    }
+                });
+    }
+
     public MutableLiveData<List<FaceUserBean>> getFaceLD() {
         return faceLD;
     }
 
     public void getFaceDatas() {
         //showLoading(true);
+        addInfo("鏌ヨ浜鸿劯鏁版嵁======銆嬭皟鐢ㄦ帴鍙�");
         getRetrofitService(Apis.class).allFaceList( LMobileInfo.getDeviceUniqueId())
                 .compose(RxUtils.schedulersTransformer())
                 .subscribe(new SimpleObserver<BaseResponse<CabinetFaceBean>>(rxJavaGcManager) {
@@ -291,12 +344,13 @@
         param.setCabinetId(MApplication.getConfigBean().getId());
         param.setMemberId(loginBean.getMemberId());
         param.setGridId(gridDo.getGridId());
+        EventBus.getDefault().post(new HttpEvent("===>瓒呮椂鏈叧闂�-璇锋眰"));
         getRetrofitService(Apis.class).timeOutUnCloseAlarm(ParamsUtil.encodeRequestBody(param))
                 .compose(RxUtils.schedulersTransformer())
                 .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                     @Override
                     public void onNext(@NonNull BaseResponse response) {
-                        toast("瓒呮椂鏈叧闂ㄦ帴鍙h皟鐢ㄦ垚鍔�");
+                        toast("===>瓒呮椂鏈叧闂�-杩斿洖");
                     }
 
                     @Override
@@ -319,12 +373,13 @@
         param.setMemberId(loginBean.getMemberId());
         param.setGridId(gridDo.getGridId());
         param.setKeyStatus(!TextUtils.isEmpty(gridDo.getCurKeyCode())?1:2);
+        EventBus.getDefault().post(new HttpEvent("===>棣栭〉鍏抽棴鏌滄牸-璇锋眰"));
         getRetrofitService(Apis.class).closeGrid(ParamsUtil.encodeRequestBody(param))
                 .compose(RxUtils.schedulersTransformer())
                 .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) {
                     @Override
                     public void onNext(@NonNull BaseResponse response) {
-
+                        EventBus.getDefault().post(new HttpEvent("===>棣栭〉鍏抽棴鏌滄牸-杩斿洖"));
                     }
 
                     @Override
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/BraceletLogUtils.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/BraceletLogUtils.java
index a2716c6..070bf0a 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/BraceletLogUtils.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/BraceletLogUtils.java
@@ -14,14 +14,14 @@
     public static Long lastTime = 0L;
 
     public static void saveLog(String msg){
-        String time = TimeUtils.getNowDate();
+        /*String time = TimeUtils.getNowDate();
         String text = SpUtil.getString(LOG_KEY);
         if(TextUtils.isEmpty(text)){
             text = "";
         }
         text+= time + "锛�"+msg+"    #";
         COUNT++;
-        SpUtil.saveString(LOG_KEY,text);
+        SpUtil.saveString(LOG_KEY,text);*/
 
     }
 
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java
index 2eb455d..dbe30e2 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/CrashHandler.java
@@ -11,10 +11,12 @@
 import android.os.Environment;
 import android.os.Looper;
 
+import com.doumee.keyCabinet.MApplication;
 import com.doumee.keyCabinet.ui.guide.GuideActivity;
 import com.doumee.keyCabinet.ui.main.MainActivity;
+import com.doumee.keyCabinet.utils.update.FileUtil;
 import com.doumee.lib_coremodel.util.SpUtil;
-import com.innohi.YNHAPI;
+import com.mc.enjoysdk.McSystemUi;
 
 import java.io.BufferedWriter;
 import java.io.ByteArrayOutputStream;
@@ -28,6 +30,7 @@
 import java.lang.Thread.UncaughtExceptionHandler;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.List;
 import java.util.Properties;
 
 /**
@@ -40,7 +43,7 @@
  */
 public class CrashHandler implements UncaughtExceptionHandler {
 	private static final String TAG = "CrashHandler";
-	private static String PATH = Environment.getExternalStorageDirectory().getPath() + "/log/";
+	private static String PATH =  "/log/";
 	public static final String FILE_NAME = "crash";
 	//log鏂囦欢鐨勫悗缂�鍚�
 	private static final String FILE_NAME_SUFFIX = ".txt";
@@ -87,9 +90,8 @@
 	public void uncaughtException(Thread thread, Throwable ex) {
 		try {
 			//瀵煎嚭寮傚父淇℃伅鍒癝D鍗′腑
-			YNHAPI mAPI = YNHAPI.getInstance();
-			mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
-			dumpExceptionToSDCard(ex);
+			McSystemUi mcSystemUi = McSystemUi.getInstance(mContext);
+			MCUtils.show(mcSystemUi);
 			long time = SpUtil.getLong("err_app");
 			SpUtil.saveLong("err_app",System.currentTimeMillis());
 			if(System.currentTimeMillis()-time>60000){
@@ -111,50 +113,40 @@
 			}
 			//杩欓噷鍙互閫氳繃缃戠粶涓婁紶寮傚父淇℃伅鍒版湇鍔″櫒锛屼究浜庡紑鍙戜汉鍛樺垎鏋愭棩蹇椾粠鑰岃В鍐砨ug
 
-		} catch (IOException e) {
-			e.printStackTrace();
-			System.out.println("閿欒鏃ュ織1"+e.getMessage());
-		}
-		//鎵撳嵃鍑哄綋鍓嶈皟鐢ㄦ爤淇℃伅
-		ex.printStackTrace();
-		//濡傛灉绯荤粺鎻愪緵浜嗛粯璁ょ殑寮傚父澶勭悊鍣紝鍒欎氦缁欑郴缁熷幓缁撴潫鎴戜滑鐨勭▼搴忥紝鍚﹀垯灏辩敱鎴戜滑鑷繁缁撴潫鑷繁
-		if (mDefaultHandler != null) {
-			mDefaultHandler.uncaughtException(thread, ex);
-		} else {
-			android.os.Process.killProcess(android.os.Process.myPid());
-		}
-
-		if (!handleException(ex) && mDefaultHandler != null) {
-			// 濡傛灉鐢ㄦ埛娌℃湁澶勭悊鍒欒绯荤粺榛樿鐨勫紓甯稿鐞嗗櫒鏉ュ鐞�
-			mDefaultHandler.uncaughtException(thread, ex);
-		} else {
-			/*try {
-				Thread.sleep(500);
-			} catch (InterruptedException e) {
-				Log.e(TAG, "error : ", e);
-			}*/
-			/*System.out.println("閲嶅惎搴旂敤");
-			// 鍒涘缓涓�涓柊鐨勫惎鍔ㄦ剰鍥�
-			Intent intent = new Intent(mContext, GuideActivity.class);
-			// 璁剧疆FLAG_ACTIVITY_CLEAR_TASK鏍囧織浣�
-			intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
-			// 浣跨敤PendingIntent鍖呰鍚姩鎰忓浘
-			PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
-			// 鑾峰彇AlarmManager瀹炰緥
-			AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
-			// 鍦�500姣鍚庤Е鍙戦噸鍚搷浣�
-			alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 10, pendingIntent);
-
-			android.os.Process.killProcess(android.os.Process.myPid());
-			System.exit(1);*/
-			/*// 鏈崟鑾峰紓甯稿啓鏂囦欢
-			writeCrashInfoToFile(ex);
-			// 閫�鍑烘暣涓簲鐢�
+			//鎵撳嵃鍑哄綋鍓嶈皟鐢ㄦ爤淇℃伅
+			ex.printStackTrace();
+			//濡傛灉绯荤粺鎻愪緵浜嗛粯璁ょ殑寮傚父澶勭悊鍣紝鍒欎氦缁欑郴缁熷幓缁撴潫鎴戜滑鐨勭▼搴忥紝鍚﹀垯灏辩敱鎴戜滑鑷繁缁撴潫鑷繁
 			if (mDefaultHandler != null) {
 				mDefaultHandler.uncaughtException(thread, ex);
 			} else {
-				System.exit(0);
-			}*/
+				android.os.Process.killProcess(android.os.Process.myPid());
+			}
+
+			if (!handleException(ex) && mDefaultHandler != null) {
+				// 濡傛灉鐢ㄦ埛娌℃湁澶勭悊鍒欒绯荤粺榛樿鐨勫紓甯稿鐞嗗櫒鏉ュ鐞�
+				mDefaultHandler.uncaughtException(thread, ex);
+			}
+			long current = System.currentTimeMillis();
+			String time2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));
+			try {
+				ByteArrayOutputStream out = new ByteArrayOutputStream();
+				PrintStream print = new PrintStream(out);
+				//瀵煎嚭鍙戠敓寮傚父鐨勬椂闂�
+				print.println(time2);
+				//瀵煎嚭鎵嬫満淇℃伅
+				dumpPhoneInfo(print);
+				print.println();
+				ex.printStackTrace(print);
+				SpUtil.saveString(FILE_NAME+time2,new String(out.toByteArray()));
+
+				print.close();
+			} catch (Exception e) {
+				e.printStackTrace();
+				System.out.println("閿欒鏃ュ織2"+e.getMessage());
+				//LogUtils.e(TAG, "dump crash info failed");
+			}
+		}catch (Exception e){
+			e.printStackTrace();
 		}
 	}
 
@@ -200,6 +192,8 @@
 		} catch (NameNotFoundException e) {
 			e.printStackTrace();
 			System.out.println("閿欒鏃ュ織3"+e.getMessage());
+		}catch (Exception e){
+			e.printStackTrace();
 		}
 	}
 
@@ -244,7 +238,6 @@
 						Build.BRAND,
 						// android SDK鐗堟湰
 						Build.VERSION.RELEASE);
-		//sp.setString(Constants.SP_CRASH_EXCEPTION, errorLog);
 		return null;
 	}
 
@@ -272,7 +265,8 @@
 			dumpPhoneInfo(print);
 			print.println();
 			ex.printStackTrace(print);
-			//SpUtil.saveString(FILE_NAME+time,new String(out.toByteArray()));
+			SpUtil.saveString(FILE_NAME+time,new String(out.toByteArray()));
+
 			print.close();
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -280,7 +274,7 @@
 			//LogUtils.e(TAG, "dump crash info failed");
 		}
 		//浠ュ綋鍓嶆椂闂村垱寤簂og鏂囦欢
-		File file = new File(PATH , FILE_NAME + time + FILE_NAME_SUFFIX);
+		File file = new File(FileUtil.getFile(mContext)+PATH , FILE_NAME + time + FILE_NAME_SUFFIX);
 		try {
 			PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
 			//瀵煎嚭鍙戠敓寮傚父鐨勬椂闂�
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/MCUtils.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/MCUtils.java
new file mode 100644
index 0000000..67d78b4
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/MCUtils.java
@@ -0,0 +1,23 @@
+package com.doumee.keyCabinet.utils;
+
+import com.mc.enjoysdk.McSystemUi;
+import com.mc.enjoysdk.transform.McSystemUiFlag;
+
+public class MCUtils {
+    public static void hind(McSystemUi mcSystemUi){
+        mcSystemUi.temporarilySwitchStatusBar(false);
+        mcSystemUi.temporarilySwitchNavigation(false);
+        /*//闅愯棌鐘舵�佹爮淇℃伅
+        mcSystemUi.disableStatusBarItem(McSystemUiFlag.DISABLE_SYSTEM_INFO);
+        //绂佹鐘舵�佹爮寮瑰嚭
+        mcSystemUi.disableStatusBarItem(McSystemUiFlag.DISABLE_NOTIFICATION_ALERTS);
+        //绂佹鐘舵�佹爮涓嬫媺
+        mcSystemUi.disableStatusBarItem(McSystemUiFlag.DISABLE_EXPAND);*/
+    }
+
+    public static void show(McSystemUi mcSystemUi){
+        //mcSystemUi.disableStatusBarItem(McSystemUiFlag.DISABLE_NONE);
+        mcSystemUi.temporarilySwitchStatusBar(true);
+        mcSystemUi.temporarilySwitchNavigation(true);
+    }
+}
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java
index d68579e..11f64e6 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java
@@ -5,34 +5,20 @@
 import android.hardware.usb.UsbDevice;
 import android.hardware.usb.UsbInterface;
 import android.hardware.usb.UsbManager;
+import android.serialport.SerialPortFinder;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public class SportUtils {
     public static List<String> getSerialPortPaths(Context context) {
-        UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
-        List<UsbDevice> devices = new ArrayList<>(usbManager.getDeviceList().values());
+        // 鑾峰彇鎵�鏈変覆鍙h澶囪矾寰�
+        String[] devices = new SerialPortFinder().getAllDevicesPath();
         List<String> serialPaths = new ArrayList<>();
-
-        for (UsbDevice device : devices) {
-            for (int i = 0; i < device.getInterfaceCount(); i++) {
-                UsbInterface intf = device.getInterface(i);
-                if (intf.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) {
-                    serialPaths.add(device.getDeviceName());
-                    break;
-                }
+        if(devices!=null){
+            for(String key:devices){
+                serialPaths.add(key);
             }
-        }
-        if(serialPaths.size()==0){
-            serialPaths.add("/dev/ttyS0");
-            serialPaths.add("/dev/ttyS1");
-            serialPaths.add("/dev/ttyS2");
-            serialPaths.add("/dev/ttyS3");
-            serialPaths.add("/dev/ttyS4");
-            serialPaths.add("/dev/ttyS5");
-            serialPaths.add("/dev/ttyS6");
-            serialPaths.add("/dev/ttyS7");
         }
         return serialPaths;
     }
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/FileUtil.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/FileUtil.java
index 596cbae..42bd3b6 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/FileUtil.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/FileUtil.java
@@ -10,6 +10,9 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
 import java.sql.Timestamp;
 import java.text.DecimalFormat;
 
@@ -236,4 +239,60 @@
 		}
 		return file;
 	}
+
+	public static interface DownLoadCallBack{
+		void sucess();
+		void err(String e);
+	}
+
+	public static void downLoadFile(String filePath,String url,DownLoadCallBack callBack){
+		try {
+			URL u = new URL(url);
+			HttpURLConnection conn = (HttpURLConnection) u.openConnection();
+			conn.setConnectTimeout(10000);
+			int responeCode = conn.getResponseCode();
+			InputStream is;
+			if (responeCode == 200) {
+				is = conn.getInputStream();
+			} else {
+				//杩炴帴澶辫触
+				if(callBack!=null){
+					callBack.err("涓嬭浇鍦板潃閿欒");
+				}
+				return;
+			}
+
+			int fileSize = conn.getContentLength();
+			if (fileSize < 1 || is == null) {
+				//鏂囦欢澶у皬涓嶅
+				if(callBack!=null){
+					callBack.err("鏂囦欢澶у皬涓嶅");
+				}
+				return;
+			} else {
+				//涓嬭浇
+				if (FileUtil.deleteFile(filePath)) {// 鍒犻櫎鍘熸潵鐨勫畨瑁呮枃浠跺啀涓嬭浇
+					FileOutputStream fos = new FileOutputStream(filePath);
+					byte[] bytes = new byte[1024];
+					int len = -1;
+					while ((len = is.read(bytes)) != -1) {
+						fos.write(bytes, 0, len);
+						fos.flush();
+					}
+					//涓嬭浇瀹屾垚
+					if(callBack!=null){
+						callBack.sucess();
+					}
+					is.close();
+					fos.close();
+				}
+			}
+		} catch (Exception e) {
+			//涓嬭浇鎶ラ敊
+			if(callBack!=null){
+				callBack.err(e.getMessage());
+			}
+			e.printStackTrace();
+		}
+	}
 }
\ No newline at end of file
diff --git a/keyCabinet-android/app/src/main/res/layout/change_url_activity.xml b/keyCabinet-android/app/src/main/res/layout/change_url_activity.xml
index 10cb068..38f938b 100644
--- a/keyCabinet-android/app/src/main/res/layout/change_url_activity.xml
+++ b/keyCabinet-android/app/src/main/res/layout/change_url_activity.xml
@@ -60,131 +60,188 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintEnd_toEndOf="parent"/>
 
-        <TextView
-            android:id="@+id/tv2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="璁惧缂栧彿"
-            android:textColor="#ff111111"
-            android:textSize="27sp"
-            android:textStyle="bold"
-            app:layout_constraintTop_toBottomOf="@+id/viewBack"
-            app:layout_constraintStart_toStartOf="parent"
-            android:layout_marginTop="30dp"
-            android:layout_marginLeft="30dp"/>
+       <androidx.core.widget.NestedScrollView
+           android:layout_width="match_parent"
+           android:layout_height="0dp"
+           app:layout_constraintTop_toBottomOf="@+id/viewBack"
+           app:layout_constraintBottom_toTopOf="@+id/tv_bc"
+           android:fillViewport="true">
 
-        <View
-            android:id="@+id/v_1"
-            android:layout_width="match_parent"
-            android:layout_height="75dp"
-            app:layout_constraintTop_toBottomOf="@+id/tv2"
-            android:layout_marginTop="18dp"
-            android:background="@drawable/shape_et_bg"
-            android:layout_marginLeft="30dp"
-            android:layout_marginRight="30dp"/>
+           <androidx.constraintlayout.widget.ConstraintLayout
+               android:layout_width="match_parent"
+               android:layout_height="match_parent">
 
-        <EditText
-            android:id="@+id/et_no"
-            android:layout_width="0dp"
-            android:layout_height="75dp"
-            android:background="@null"
-            android:text=""
-            android:textColor="#111111"
-            android:hint="璇疯緭鍏ヨ澶囩紪鍙�"
-            android:textColorHint="#999999"
-            android:textSize="24sp"
-            android:inputType="text"
-            app:layout_constraintTop_toTopOf="@+id/v_1"
-            app:layout_constraintStart_toStartOf="@+id/v_1"
-            app:layout_constraintEnd_toEndOf="@+id/v_1"
-            android:layout_marginLeft="18dp"
-            android:layout_marginRight="18dp"
-            android:gravity="center_vertical"
-            android:lines="1"/>
+               <TextView
+                   android:id="@+id/tv2"
+                   android:layout_width="wrap_content"
+                   android:layout_height="wrap_content"
+                   android:text="璁惧缂栧彿"
+                   android:textColor="#ff111111"
+                   android:textSize="27sp"
+                   android:textStyle="bold"
+                   app:layout_constraintTop_toTopOf="parent"
+                   app:layout_constraintStart_toStartOf="parent"
+                   android:layout_marginTop="30dp"
+                   android:layout_marginLeft="30dp"/>
 
-        <TextView
-            android:id="@+id/tv3"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="鎺ュ彛鍦板潃"
-            android:textColor="#ff111111"
-            android:textSize="27sp"
-            android:textStyle="bold"
-            app:layout_constraintTop_toBottomOf="@+id/v_1"
-            app:layout_constraintStart_toStartOf="parent"
-            android:layout_marginTop="30dp"
-            android:layout_marginLeft="30dp"/>
+               <View
+                   android:id="@+id/v_1"
+                   android:layout_width="match_parent"
+                   android:layout_height="75dp"
+                   app:layout_constraintTop_toBottomOf="@+id/tv2"
+                   android:layout_marginTop="18dp"
+                   android:background="@drawable/shape_et_bg"
+                   android:layout_marginLeft="30dp"
+                   android:layout_marginRight="30dp"/>
 
-        <View
-            android:id="@+id/v_2"
-            android:layout_width="match_parent"
-            android:layout_height="75dp"
-            app:layout_constraintTop_toBottomOf="@+id/tv3"
-            android:layout_marginTop="18dp"
-            android:background="@drawable/shape_et_bg"
-            android:layout_marginLeft="30dp"
-            android:layout_marginRight="30dp"/>
+               <EditText
+                   android:id="@+id/et_no"
+                   android:layout_width="0dp"
+                   android:layout_height="75dp"
+                   android:background="@null"
+                   android:text=""
+                   android:textColor="#111111"
+                   android:hint="璇疯緭鍏ヨ澶囩紪鍙�"
+                   android:textColorHint="#999999"
+                   android:textSize="24sp"
+                   android:inputType="text"
+                   app:layout_constraintTop_toTopOf="@+id/v_1"
+                   app:layout_constraintStart_toStartOf="@+id/v_1"
+                   app:layout_constraintEnd_toEndOf="@+id/v_1"
+                   android:layout_marginLeft="18dp"
+                   android:layout_marginRight="18dp"
+                   android:gravity="center_vertical"
+                   android:lines="1"/>
 
-        <EditText
-            android:id="@+id/et_url"
-            android:layout_width="0dp"
-            android:layout_height="75dp"
-            android:background="@null"
-            android:text=""
-            android:textColor="#111111"
-            android:hint="璇疯緭鍏ユ帴鍙e湴鍧�"
-            android:textColorHint="#999999"
-            android:textSize="24sp"
-            android:inputType="text"
-            app:layout_constraintTop_toTopOf="@+id/v_2"
-            app:layout_constraintStart_toStartOf="@+id/v_2"
-            app:layout_constraintEnd_toEndOf="@+id/v_2"
-            android:layout_marginLeft="18dp"
-            android:layout_marginRight="18dp"
-            android:gravity="center_vertical"
-            android:lines="1"/>
+               <TextView
+                   android:id="@+id/tv3"
+                   android:layout_width="wrap_content"
+                   android:layout_height="wrap_content"
+                   android:text="鎺ュ彛鍦板潃"
+                   android:textColor="#ff111111"
+                   android:textSize="27sp"
+                   android:textStyle="bold"
+                   app:layout_constraintTop_toBottomOf="@+id/v_1"
+                   app:layout_constraintStart_toStartOf="parent"
+                   android:layout_marginTop="30dp"
+                   android:layout_marginLeft="30dp"/>
 
-        <TextView
-            android:id="@+id/tv4"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="鎺ュ彛璋冪敤闂撮殧(绉�)"
-            android:textColor="#ff111111"
-            android:textSize="27sp"
-            android:textStyle="bold"
-            app:layout_constraintTop_toBottomOf="@+id/v_2"
-            app:layout_constraintStart_toStartOf="parent"
-            android:layout_marginTop="30dp"
-            android:layout_marginLeft="30dp"/>
+               <View
+                   android:id="@+id/v_2"
+                   android:layout_width="match_parent"
+                   android:layout_height="75dp"
+                   app:layout_constraintTop_toBottomOf="@+id/tv3"
+                   android:layout_marginTop="18dp"
+                   android:background="@drawable/shape_et_bg"
+                   android:layout_marginLeft="30dp"
+                   android:layout_marginRight="30dp"/>
 
-        <View
-            android:id="@+id/v_3"
-            android:layout_width="match_parent"
-            android:layout_height="75dp"
-            app:layout_constraintTop_toBottomOf="@+id/tv4"
-            android:layout_marginTop="18dp"
-            android:background="@drawable/shape_et_bg"
-            android:layout_marginLeft="30dp"
-            android:layout_marginRight="30dp"/>
+               <EditText
+                   android:id="@+id/et_url"
+                   android:layout_width="0dp"
+                   android:layout_height="75dp"
+                   android:background="@null"
+                   android:text=""
+                   android:textColor="#111111"
+                   android:hint="璇疯緭鍏ユ帴鍙e湴鍧�"
+                   android:textColorHint="#999999"
+                   android:textSize="24sp"
+                   android:inputType="text"
+                   app:layout_constraintTop_toTopOf="@+id/v_2"
+                   app:layout_constraintStart_toStartOf="@+id/v_2"
+                   app:layout_constraintEnd_toEndOf="@+id/v_2"
+                   android:layout_marginLeft="18dp"
+                   android:layout_marginRight="18dp"
+                   android:gravity="center_vertical"
+                   android:lines="1"/>
 
-        <EditText
-            android:id="@+id/et_time"
-            android:layout_width="0dp"
-            android:layout_height="75dp"
-            android:background="@null"
-            android:text=""
-            android:textColor="#111111"
-            android:hint="璇疯緭鍏ユ帴鍙h皟鐢ㄩ棿闅�(绉�)"
-            android:textColorHint="#999999"
-            android:textSize="24sp"
-            android:inputType="number"
-            app:layout_constraintTop_toTopOf="@+id/v_3"
-            app:layout_constraintStart_toStartOf="@+id/v_3"
-            app:layout_constraintEnd_toEndOf="@+id/v_3"
-            android:layout_marginLeft="18dp"
-            android:layout_marginRight="18dp"
-            android:gravity="center_vertical"
-            android:lines="1"/>
+               <TextView
+                   android:id="@+id/tv4"
+                   android:layout_width="wrap_content"
+                   android:layout_height="wrap_content"
+                   android:text="鎺ュ彛璋冪敤闂撮殧(绉�)"
+                   android:textColor="#ff111111"
+                   android:textSize="27sp"
+                   android:textStyle="bold"
+                   app:layout_constraintTop_toBottomOf="@+id/v_2"
+                   app:layout_constraintStart_toStartOf="parent"
+                   android:layout_marginTop="30dp"
+                   android:layout_marginLeft="30dp"/>
+
+               <View
+                   android:id="@+id/v_3"
+                   android:layout_width="match_parent"
+                   android:layout_height="75dp"
+                   app:layout_constraintTop_toBottomOf="@+id/tv4"
+                   android:layout_marginTop="18dp"
+                   android:background="@drawable/shape_et_bg"
+                   android:layout_marginLeft="30dp"
+                   android:layout_marginRight="30dp"/>
+
+               <EditText
+                   android:id="@+id/et_time"
+                   android:layout_width="0dp"
+                   android:layout_height="75dp"
+                   android:background="@null"
+                   android:text=""
+                   android:textColor="#111111"
+                   android:hint="璇疯緭鍏ユ帴鍙h皟鐢ㄩ棿闅�(绉�)"
+                   android:textColorHint="#999999"
+                   android:textSize="24sp"
+                   android:inputType="number"
+                   app:layout_constraintTop_toTopOf="@+id/v_3"
+                   app:layout_constraintStart_toStartOf="@+id/v_3"
+                   app:layout_constraintEnd_toEndOf="@+id/v_3"
+                   android:layout_marginLeft="18dp"
+                   android:layout_marginRight="18dp"
+                   android:gravity="center_vertical"
+                   android:lines="1"/>
+
+               <TextView
+                   android:id="@+id/tv5"
+                   android:layout_width="wrap_content"
+                   android:layout_height="wrap_content"
+                   android:text="閫夋嫨鎽勫儚澶�(0鎴�1)"
+                   android:textColor="#ff111111"
+                   android:textSize="27sp"
+                   android:textStyle="bold"
+                   app:layout_constraintTop_toBottomOf="@+id/v_3"
+                   app:layout_constraintStart_toStartOf="parent"
+                   android:layout_marginTop="30dp"
+                   android:layout_marginLeft="30dp"/>
+
+               <View
+                   android:id="@+id/v_4"
+                   android:layout_width="match_parent"
+                   android:layout_height="75dp"
+                   app:layout_constraintTop_toBottomOf="@+id/tv5"
+                   android:layout_marginTop="18dp"
+                   android:background="@drawable/shape_et_bg"
+                   android:layout_marginLeft="30dp"
+                   android:layout_marginRight="30dp"/>
+
+               <EditText
+                   android:id="@+id/et_xj"
+                   android:layout_width="0dp"
+                   android:layout_height="75dp"
+                   android:background="@null"
+                   android:text=""
+                   android:textColor="#111111"
+                   android:hint="璇疯緭鍏ユ憚鍍忓ご缂栧彿(0鎴�1)"
+                   android:textColorHint="#999999"
+                   android:textSize="24sp"
+                   android:inputType="number"
+                   app:layout_constraintTop_toTopOf="@+id/v_4"
+                   app:layout_constraintStart_toStartOf="@+id/v_4"
+                   app:layout_constraintEnd_toEndOf="@+id/v_4"
+                   android:layout_marginLeft="18dp"
+                   android:layout_marginRight="18dp"
+                   android:gravity="center_vertical"
+                   android:lines="1"/>
+
+           </androidx.constraintlayout.widget.ConstraintLayout>
+
+       </androidx.core.widget.NestedScrollView>
 
         <TextView
             android:id="@+id/tv_bc"
diff --git a/keyCabinet-android/app/src/main/res/layout/face_activity.xml b/keyCabinet-android/app/src/main/res/layout/face_activity.xml
index bd91c0e..a3c6e6d 100644
--- a/keyCabinet-android/app/src/main/res/layout/face_activity.xml
+++ b/keyCabinet-android/app/src/main/res/layout/face_activity.xml
@@ -220,13 +220,57 @@
             </androidx.constraintlayout.widget.ConstraintLayout>
 
             <androidx.constraintlayout.widget.ConstraintLayout
-                android:layout_width="match_parent"
+                android:id="@+id/cl_zw_gl"
+                android:layout_width="0dp"
+                android:layout_height="75dp"
+                android:layout_marginLeft="30dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                android:layout_marginBottom="30dp"
+                android:background="@drawable/shape_r30_face_bg"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toLeftOf="@+id/cl_sk_gl"
+                app:commandType="@{9}"
+                app:onClickCommand="@{model.myTypeCommand}"
+                >
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    >
+
+                    <ImageView
+                        android:layout_width="28dp"
+                        android:layout_height="28dp"
+                        android:src="@mipmap/ic_zhiwen"
+                        android:layout_gravity="center_vertical"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="鎸囩汗楠岃瘉"
+                        android:textColor="#ff279baa"
+                        android:textSize="24sp"
+                        android:textStyle="bold"
+                        android:layout_marginLeft="12dp"/>
+
+                </LinearLayout>
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/cl_sk_gl"
+                android:layout_width="0dp"
                 android:layout_height="75dp"
                 android:layout_marginLeft="30dp"
                 android:layout_marginRight="30dp"
                 app:layout_constraintBottom_toBottomOf="parent"
                 android:layout_marginBottom="30dp"
                 android:background="@drawable/shape_r30_face_bg"
+                app:layout_constraintLeft_toRightOf="@+id/cl_zw_gl"
+                app:layout_constraintRight_toRightOf="parent"
                 app:commandType="@{1}"
                 app:onClickCommand="@{model.myTypeCommand}"
                 >
@@ -252,14 +296,15 @@
                         android:textColor="#ff279baa"
                         android:textSize="24sp"
                         android:textStyle="bold"
-                        android:layout_marginLeft="7dp"/>
+                        android:layout_marginLeft="12dp"/>
 
                 </LinearLayout>
+
             </androidx.constraintlayout.widget.ConstraintLayout>
 
         </androidx.constraintlayout.widget.ConstraintLayout>
 
-
+        <!--浜鸿劯楠岃瘉-->
         <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/cl_fail"
             android:layout_width="wrap_content"
@@ -308,6 +353,7 @@
 
         </androidx.constraintlayout.widget.ConstraintLayout>
 
+        <!-- 鍙告満閫夐獙璇佹柟寮� -->
         <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/cl_sj_xuan"
             android:layout_width="match_parent"
@@ -424,35 +470,86 @@
                 android:layout_marginBottom="30dp"
                 android:visibility="visible">
 
-                <LinearLayout
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/cl_zw_sj"
+                    android:layout_width="0dp"
+                    android:layout_height="75dp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    android:background="@drawable/shape_r30_face_bg"
+                    app:layout_constraintLeft_toLeftOf="parent"
+                    app:layout_constraintRight_toLeftOf="@+id/ll_01"
+                    android:layout_marginRight="20dp"
+                    app:commandType="@{10}"
+                    app:onClickCommand="@{model.myTypeCommand}"
+                    >
+
+                    <LinearLayout
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        >
+
+                        <ImageView
+                            android:layout_width="28dp"
+                            android:layout_height="28dp"
+                            android:src="@mipmap/ic_zhiwen"
+                            android:layout_gravity="center_vertical"/>
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="鎸囩汗"
+                            android:textColor="#ff279baa"
+                            android:textSize="24sp"
+                            android:textStyle="bold"
+                            android:layout_marginLeft="12dp"/>
+
+                    </LinearLayout>
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <androidx.constraintlayout.widget.ConstraintLayout
                     android:id="@+id/ll_01"
-                    android:layout_width="wrap_content"
+                    android:layout_width="0dp"
                     android:layout_height="match_parent"
                     app:layout_constraintTop_toTopOf="parent"
                     app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintLeft_toRightOf="@+id/cl_zw_sj"
+                    app:layout_constraintRight_toLeftOf="@+id/ll_02"
                     android:background="@drawable/shape_r30_face_bg"
                     android:paddingLeft="30dp"
                     android:paddingRight="30dp"
                     app:commandType="@{2}"
                     app:onClickCommand="@{model.myTypeCommand}">
 
-                    <ImageView
-                        android:layout_width="28dp"
-                        android:layout_height="28dp"
-                        android:src="@mipmap/ic_shuaka"
-                        android:layout_gravity="center_vertical"/>
-                    <TextView
+                    <LinearLayout
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:text="鍒峰崱楠岃瘉"
-                        android:textColor="#ff279baa"
-                        android:textSize="24sp"
-                        android:layout_marginLeft="7dp"
-                        android:textStyle="bold"
-                        android:layout_gravity="center_vertical"/>
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        >
 
-                </LinearLayout>
+                        <ImageView
+                            android:layout_width="28dp"
+                            android:layout_height="28dp"
+                            android:src="@mipmap/ic_shuaka"
+                            android:layout_gravity="center_vertical"/>
+                        <TextView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="鍒峰崱"
+                            android:textColor="#ff279baa"
+                            android:textSize="24sp"
+                            android:textStyle="bold"
+                            android:layout_marginLeft="12dp"/>
+
+                    </LinearLayout>
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
 
                 <LinearLayout
                     android:id="@+id/ll_02"
@@ -484,7 +581,125 @@
 
         </androidx.constraintlayout.widget.ConstraintLayout>
 
+        <!--鎸囩汗楠岃瘉-->
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/cl_zw"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            app:layout_constraintTop_toTopOf="@+id/camera_textureview"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:background="@color/white"
+            android:visibility="gone">
 
+            <View
+                android:id="@+id/v_c_zw"
+                android:layout_width="340dp"
+                android:layout_height="340dp"
+                android:background="@mipmap/ic_zhiwenyanzheng"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                />
+
+            <TextView
+                android:id="@+id/tv_zw_tip"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:text="璇峰皢鎵嬫寚鏀剧疆鍦ㄦ寚绾归噰闆嗗櫒涓�"
+                android:textColor="#ff666666"
+                android:textSize="24sp"
+                android:gravity="center"
+                app:layout_constraintTop_toBottomOf="@+id/v_c_zw"
+                android:layout_marginTop="42dp"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"/>
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/cl_sk_zw"
+                android:layout_width="0dp"
+                android:layout_height="75dp"
+                android:layout_marginLeft="30dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                android:layout_marginBottom="30dp"
+                android:background="@drawable/shape_r30_face_bg"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toLeftOf="@+id/cl_rl_zw"
+                app:commandType="@{1}"
+                app:onClickCommand="@{model.myTypeCommand}"
+                >
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    >
+
+                    <ImageView
+                        android:layout_width="28dp"
+                        android:layout_height="28dp"
+                        android:src="@mipmap/ic_shuaka"
+                        android:layout_gravity="center_vertical"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="鍒峰崱楠岃瘉"
+                        android:textColor="#ff279baa"
+                        android:textSize="24sp"
+                        android:textStyle="bold"
+                        android:layout_marginLeft="12dp"/>
+
+                </LinearLayout>
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/cl_rl_zw"
+                android:layout_width="0dp"
+                android:layout_height="75dp"
+                android:layout_marginLeft="30dp"
+                android:layout_marginRight="30dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                android:layout_marginBottom="30dp"
+                app:layout_constraintLeft_toRightOf="@+id/cl_sk_zw"
+                app:layout_constraintRight_toRightOf="parent"
+                android:background="@drawable/shape_r30_face_bg"
+                app:commandType="@{4}"
+                app:onClickCommand="@{model.myTypeCommand}"
+                >
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    >
+
+                    <ImageView
+                        android:layout_width="28dp"
+                        android:layout_height="28dp"
+                        android:src="@mipmap/ic_renlian"
+                        android:layout_gravity="center_vertical"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="浜鸿劯楠岃瘉"
+                        android:textColor="#ff279baa"
+                        android:textSize="24sp"
+                        android:textStyle="bold"
+                        android:layout_marginLeft="12dp"/>
+
+                </LinearLayout>
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+        <!--鍒峰崱楠岃瘉-->
         <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/cl_card"
             android:layout_width="match_parent"
@@ -520,12 +735,55 @@
                 app:layout_constraintEnd_toEndOf="parent"/>
 
             <androidx.constraintlayout.widget.ConstraintLayout
-                android:layout_width="match_parent"
+                android:id="@+id/cl_zw_sk"
+                android:layout_width="0dp"
+                android:layout_height="75dp"
+                android:layout_marginLeft="30dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                android:layout_marginBottom="30dp"
+                android:background="@drawable/shape_r30_face_bg"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toLeftOf="@+id/cl_rl_sk"
+                app:commandType="@{11}"
+                app:onClickCommand="@{model.myTypeCommand}"
+                >
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    >
+
+                    <ImageView
+                        android:layout_width="28dp"
+                        android:layout_height="28dp"
+                        android:src="@mipmap/ic_zhiwen"
+                        android:layout_gravity="center_vertical"/>
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="鎸囩汗楠岃瘉"
+                        android:textColor="#ff279baa"
+                        android:textSize="24sp"
+                        android:textStyle="bold"
+                        android:layout_marginLeft="12dp"/>
+
+                </LinearLayout>
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:id="@+id/cl_rl_sk"
+                android:layout_width="0dp"
                 android:layout_height="75dp"
                 android:layout_marginLeft="30dp"
                 android:layout_marginRight="30dp"
                 app:layout_constraintBottom_toBottomOf="parent"
                 android:layout_marginBottom="30dp"
+                app:layout_constraintLeft_toRightOf="@+id/cl_zw_sk"
+                app:layout_constraintRight_toRightOf="parent"
                 android:background="@drawable/shape_r30_face_bg"
                 app:commandType="@{4}"
                 app:onClickCommand="@{model.myTypeCommand}"
@@ -552,13 +810,14 @@
                         android:textColor="#ff279baa"
                         android:textSize="24sp"
                         android:textStyle="bold"
-                        android:layout_marginLeft="7dp"/>
+                        android:layout_marginLeft="12dp"/>
 
                 </LinearLayout>
             </androidx.constraintlayout.widget.ConstraintLayout>
 
         </androidx.constraintlayout.widget.ConstraintLayout>
 
+        <!--閰掔簿妫�娴�-->
         <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/cl_jiu"
             android:layout_width="match_parent"
diff --git a/keyCabinet-android/app/src/main/res/layout/key_cabinet_activity.xml b/keyCabinet-android/app/src/main/res/layout/key_cabinet_activity.xml
index a32a5b2..fc9932d 100644
--- a/keyCabinet-android/app/src/main/res/layout/key_cabinet_activity.xml
+++ b/keyCabinet-android/app/src/main/res/layout/key_cabinet_activity.xml
@@ -61,6 +61,19 @@
             app:layout_constraintEnd_toEndOf="parent"
             android:layout_marginRight="30dp"/>
 
+        <TextView
+            android:id="@+id/tv_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="閫夋嫨鏌滈棬"
+            android:textColor="#ff111111"
+            android:textSize="33sp"
+            android:textStyle="bold"
+            app:layout_constraintTop_toTopOf="@+id/viewBack"
+            app:layout_constraintBottom_toBottomOf="@+id/viewBack"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
         <androidx.constraintlayout.widget.ConstraintLayout
             android:id="@+id/cl_km"
             android:layout_width="match_parent"
diff --git a/keyCabinet-android/app/src/main/res/layout/main_activity.xml b/keyCabinet-android/app/src/main/res/layout/main_activity.xml
index 4b4fc50..7268c54 100644
--- a/keyCabinet-android/app/src/main/res/layout/main_activity.xml
+++ b/keyCabinet-android/app/src/main/res/layout/main_activity.xml
@@ -14,13 +14,14 @@
         android:layout_height="match_parent"
         tools:context=".ui.main.MainActivity"
         >
+
         <TextureView
             android:id="@+id/checkNirTexture"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:alpha="0"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintStart_toStartOf="parent"/>
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
 
         <com.facebook.drawee.view.SimpleDraweeView
             android:id="@+id/img1"
diff --git a/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwen.png b/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwen.png
new file mode 100644
index 0000000..29bb560
--- /dev/null
+++ b/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwen.png
Binary files differ
diff --git a/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwenluru.png b/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwenluru.png
new file mode 100644
index 0000000..abbb62b
--- /dev/null
+++ b/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwenluru.png
Binary files differ
diff --git a/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwenyanzheng.png b/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwenyanzheng.png
new file mode 100644
index 0000000..b2d2c8e
--- /dev/null
+++ b/keyCabinet-android/app/src/main/res/mipmap-xxhdpi/ic_zhiwenyanzheng.png
Binary files differ
diff --git a/keyCabinet-android/app/src/main/res/values/strings.xml b/keyCabinet-android/app/src/main/res/values/strings.xml
index 65190e7..9a89d5f 100644
--- a/keyCabinet-android/app/src/main/res/values/strings.xml
+++ b/keyCabinet-android/app/src/main/res/values/strings.xml
@@ -73,6 +73,13 @@
     <string name="on_number">璇疯緭鍏�16浣嶅簭鍒楀彿</string>
     <string name="accredit_use">搴旂敤婵�娲�</string>
     <string name="filter_vcode">0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</string>
+    <string name="accredit_off">绂荤嚎婵�娲�</string>
+    <string name="off_technological_process">绂荤嚎婵�娲绘祦绋�: </string>
+    <string name="off_technological_process_three">鍦ㄧ櫨搴︽櫤鑳戒簯骞冲彴杈撳叆璁惧纭欢鎸囩汗骞惰幏鍙栫绾挎縺娲绘枃浠讹紙License.zip锛�</string>
+    <string name="off_technological_process_four">灏嗙绾挎縺娲绘枃浠舵嫹璐濊嚦鍐呯疆SD鍗℃牴鐩綍涓�</string>
+    <string name="off_technological_process_five">鍦⊿DK鐣岄潰涓Е鍙戠绾挎縺娲�</string>
+    <string name="off_local_hardware">鏈満纭欢鎸囩汗</string>
+    <string name="off_problem">婵�娲婚亣鍒伴棶棰�?</string>
     <string name="home_face">浜鸿劯瀵煎叆</string>
     <string name="home_faceLibrary">浜鸿劯搴撶鐞�</string>
     <string name="home_camra">鍒囨崲鎽勫儚澶�</string>
diff --git a/keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java b/keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java
index f2ea06b..8d799f8 100644
--- a/keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java
+++ b/keyCabinet-android/app/src/test/java/com/doumee/ticketmachine/ExampleUnitTest.java
@@ -15,14 +15,9 @@
 public class ExampleUnitTest {
     @Test
     public void addition_isCorrect() {
-        CircularQueue queue = new CircularQueue();
-        for(int i=0;i<3;i++){
-            queue.enqueue(i+"");
-        }
-        System.out.println(queue.dequeue());
-        System.out.println(queue.dequeue());
-        System.out.println(queue.dequeue());
-        System.out.println(queue.dequeue());
+       String code = "EF 01 FF FF FF FF 01 00 03 1D 00";
+       String x = SportUtils.getBCC(code);
+       System.out.println(x);
     }
 
 
diff --git a/keyCabinet-android/datalibrary/build.gradle b/keyCabinet-android/datalibrary/build.gradle
index 9600979..1261ee8 100644
--- a/keyCabinet-android/datalibrary/build.gradle
+++ b/keyCabinet-android/datalibrary/build.gradle
@@ -3,12 +3,12 @@
 }
 
 android {
-    compileSdkVersion 29
+    compileSdkVersion 28
     buildToolsVersion "29.0.3"
 
     defaultConfig {
         minSdkVersion 22
-        targetSdkVersion 29
+        targetSdkVersion 28
         versionCode 5
         versionName "5.0"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
diff --git a/keyCabinet-android/facelibrary/build.gradle b/keyCabinet-android/facelibrary/build.gradle
index 82e58bb..331755b 100644
--- a/keyCabinet-android/facelibrary/build.gradle
+++ b/keyCabinet-android/facelibrary/build.gradle
@@ -1,12 +1,12 @@
 apply plugin: 'com.android.library'
 
 android {
-    compileSdkVersion 29
+    compileSdkVersion 28
 //    buildToolsVersion '26.0.2'
     publishNonDefault true
     defaultConfig {
         minSdkVersion 22
-        targetSdkVersion 29
+        targetSdkVersion 28
         versionCode 5
         versionName "5.0"
 
diff --git a/keyCabinet-android/lib_opensource/build.gradle b/keyCabinet-android/lib_opensource/build.gradle
index a2b1529..1a51f33 100644
--- a/keyCabinet-android/lib_opensource/build.gradle
+++ b/keyCabinet-android/lib_opensource/build.gradle
@@ -53,12 +53,12 @@
     annotationProcessor deps.lifecycle.compiler
 
     //work
-    api(deps.work.work_runtime){
+    /*api(deps.work.work_runtime){
         exclude group:"com.google.guava",module:"listenablefuture"
     }
     api (deps.work.work_rxjava2){
         exclude group:"com.google.guava",module:"listenablefuture"
-    }
+    }*/
 
     //瀵艰埅 nav
     api deps.nav.navigation_runtime
diff --git a/keyCabinet-android/settinglibrary/build.gradle b/keyCabinet-android/settinglibrary/build.gradle
index 9ff6c1c..db76a13 100644
--- a/keyCabinet-android/settinglibrary/build.gradle
+++ b/keyCabinet-android/settinglibrary/build.gradle
@@ -1,12 +1,12 @@
 apply plugin: 'com.android.library'
 
 android {
-    compileSdkVersion 29
+    compileSdkVersion 28
     buildToolsVersion "29.0.3"
 
     defaultConfig {
         minSdkVersion 22
-        targetSdkVersion 29
+        targetSdkVersion 28
         versionCode 1
         versionName "1.0"
 
diff --git a/keyCabinet-android/versions.gradle b/keyCabinet-android/versions.gradle
index b47c6e1..256b6f7 100644
--- a/keyCabinet-android/versions.gradle
+++ b/keyCabinet-android/versions.gradle
@@ -1,8 +1,8 @@
 
 def build_versions = [:]
 build_versions.min_sdk = 22
-build_versions.target_sdk = 30
-build_versions.compile_sdk = 30
+build_versions.target_sdk = 28
+build_versions.compile_sdk = 28
 build_versions.build_tools = "30.0.2"
 ext.build_versions = build_versions
 
@@ -64,11 +64,6 @@
 jetpack.datastore_preferences_rxjava2 = "androidx.datastore:datastore-preferences-rxjava2:1.0.0"
 deps.jetpack = jetpack
 
-//workManager
-def work = [:]
-work.work_runtime = "androidx.work:work-runtime:2.6.0"
-work.work_rxjava2 = "androidx.work:work-rxjava2:2.6.0"
-deps.work = work
 
 def nav=[:]
 nav.navigation_runtime = "androidx.navigation:navigation-runtime:2.3.5"

--
Gitblit v1.9.3