From 9a697d6a8bc05955b9f7322bc86dc3e920e90e14 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期四, 06 十一月 2025 18:07:21 +0800
Subject: [PATCH] Merge branch 'wuhuyancao' of http://139.186.142.91:10010/r/productDev/dmvisit into wuhuyancao

---
 keyCabinet-android/app/libs/simple-xml-2.7.1.jar                                                   |    0 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationActivity.java    |   55 +++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java      |    2 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationVM.java          |   21 +
 keyCabinet-android/app/src/main/res/layout/key_cabinet_activity.xml                                |   13 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationVM.java        |   22 +
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java   |    7 
 keyCabinet-android/app/libs/API-20250310.jar                                                       |    0 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/FileUtil.java              |   59 ++++
 keyCabinet-android/app/src/main/res/layout/chose_activation_activity.xml                           |   66 ++++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/BatchOpenGridAdminParam.java |   10 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/OpenGridDriverParam.java     |   10 
 keyCabinet-android/app/src/main/res/values/strings.xml                                             |    7 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java               |    6 
 keyCabinet-android/app/src/main/AndroidManifest.xml                                                |   52 ++-
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/BraceletLogUtils.java             |    4 
 keyCabinet-android/app/src/main/res/layout/offline_activation_activity.xml                         |  263 ++++++++++++++++++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationActivity.java  |  190 +++++++++++++
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/DevConfigBean.java                 |   10 
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java               |    9 
 20 files changed, 779 insertions(+), 27 deletions(-)

diff --git a/keyCabinet-android/app/libs/API-20250310.jar b/keyCabinet-android/app/libs/API-20250310.jar
new file mode 100644
index 0000000..0235b6c
--- /dev/null
+++ b/keyCabinet-android/app/libs/API-20250310.jar
Binary files differ
diff --git a/keyCabinet-android/app/libs/simple-xml-2.7.1.jar b/keyCabinet-android/app/libs/simple-xml-2.7.1.jar
new file mode 100644
index 0000000..b09d6c7
--- /dev/null
+++ b/keyCabinet-android/app/libs/simple-xml-2.7.1.jar
Binary files differ
diff --git a/keyCabinet-android/app/src/main/AndroidManifest.xml b/keyCabinet-android/app/src/main/AndroidManifest.xml
index 9b7b0e1..1246ac8 100644
--- a/keyCabinet-android/app/src/main/AndroidManifest.xml
+++ b/keyCabinet-android/app/src/main/AndroidManifest.xml
@@ -16,6 +16,12 @@
         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" />
         <activity
@@ -27,31 +33,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 +80,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,20 +90,22 @@
             <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" />
+        -->
         <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" />
@@ -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"
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..2f176a9 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
@@ -20,6 +20,8 @@
     private String info;
     //璁惧鍚嶇О
     private String name;
+    //浜鸿劯璇嗗埆绂荤嚎婵�娲绘枃浠朵笅杞藉湴鍧�
+    private String activateFileUrl;
     private CabinetConfigDataBean cabinetConfigDataVO;
 
     private List<ManageKeyCabinetBean> cabinetGridInfoVOList;
@@ -103,4 +105,12 @@
     public void setCabinetConfigDataVO(CabinetConfigDataBean cabinetConfigDataVO) {
         this.cabinetConfigDataVO = cabinetConfigDataVO;
     }
+
+    public String getActivateFileUrl() {
+        return activateFileUrl;
+    }
+
+    public void setActivateFileUrl(String activateFileUrl) {
+        this.activateFileUrl = activateFileUrl;
+    }
 }
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..dd4d1de 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,8 @@
     private int cabinetId;
     //鏌滄牸涓婚敭
     private int gridId;
+    //寮�鍚柟寮忥細0=绯荤粺寮�鍚紱1=鎵嬪姩寮�鍚�
+    private int openType;
 
     public int getAuthType() {
         return authType;
@@ -44,4 +46,12 @@
     public void setGridId(int gridId) {
         this.gridId = gridId;
     }
+
+    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/ui/face/ChoseActivationActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationActivity.java
new file mode 100644
index 0000000..31d9203
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationActivity.java
@@ -0,0 +1,55 @@
+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.lib_coremodel.bean.event.ActionEventData;
+import com.innohi.YNHAPI;
+
+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());
+
+        YNHAPI mAPI = YNHAPI.getInstance();
+        mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
+    }
+
+    @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..c7ffe76 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);
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..6245db2
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationActivity.java
@@ -0,0 +1,190 @@
+package com.doumee.keyCabinet.ui.face;
+
+import androidx.annotation.Nullable;
+
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Environment;
+import android.text.TextUtils;
+import android.view.View;
+
+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);
+    }
+
+    @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;
+                    FileUtil.downLoadFile(filePath, MApplication.getConfigBean().getActivateFileUrl(), new FileUtil.DownLoadCallBack() {
+                        @Override
+                        public void sucess() {
+                            ToastView.show(MApplication.mContext,"涓嬭浇鎴愬姛");
+                            isDownLoad = false;
+                        }
+
+                        @Override
+                        public void err(String e) {
+                            ToastView.show(MApplication.mContext,e);
+                            isDownLoad = false;
+                        }
+                    });
+                }
+                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();
+    }
+}
\ 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..251a8e0
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationVM.java
@@ -0,0 +1,22 @@
+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 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/keyCabinet/KeyCabinetActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java
index 2377446..f3e8818 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);
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/main/MainActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
index 2584140..204cdf4 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
@@ -69,6 +69,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;
@@ -458,6 +459,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);
@@ -577,7 +584,7 @@
                         /*
                          *瑕佹墽琛岀殑鎿嶄綔*/
 
-                        startActivity(new Intent(mContext, ActivationActivity.class));
+                        startActivity(new Intent(mContext, ChoseActivationActivity.class));
                     }
                 };
                 Timer timer = new Timer();
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/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/chose_activation_activity.xml b/keyCabinet-android/app/src/main/res/layout/chose_activation_activity.xml
new file mode 100644
index 0000000..ef78ae5
--- /dev/null
+++ b/keyCabinet-android/app/src/main/res/layout/chose_activation_activity.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout >
+    <data>
+        <import type="com.doumee.lib_coremodel.base.BaseViewModel"/>
+        <import type="android.view.View"/>
+        <variable
+            name="model"
+            type="com.doumee.keyCabinet.ui.face.ChoseActivationVM" />
+    </data>
+    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        tools:context=".ui.face.ChoseActivationActivity">
+
+        <TextView
+            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="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_marginTop="30dp"/>
+
+        <TextView
+            android:id="@+id/tv_zx"
+            android:layout_width="match_parent"
+            android:layout_height="75dp"
+            android:text="鍦ㄧ嚎婵�娲�"
+            android:textColor="@color/white"
+            android:textSize="24sp"
+            android:textStyle="bold"
+            android:gravity="center"
+            android:background="@drawable/shape_mb_bt_ok"
+            android:layout_marginLeft="30dp"
+            android:layout_marginRight="30dp"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:commandType="@{1}"
+            app:onClickCommand="@{model.myTypeCommand}"
+            android:layout_marginBottom="30dp"/>
+
+        <TextView
+            android:id="@+id/tv_km"
+            android:layout_width="match_parent"
+            android:layout_height="75dp"
+            android:text="绂荤嚎婵�娲�"
+            android:textColor="@color/white"
+            android:textSize="24sp"
+            android:textStyle="bold"
+            android:gravity="center"
+            android:background="@drawable/shape_mb_bt_ok"
+            android:layout_marginLeft="30dp"
+            android:layout_marginRight="30dp"
+            app:layout_constraintTop_toBottomOf="@+id/tv_zx"
+            android:layout_marginTop="60dp"
+            app:commandType="@{2}"
+            app:onClickCommand="@{model.myTypeCommand}"
+            android:layout_marginBottom="30dp"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>
\ No newline at end of file
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/offline_activation_activity.xml b/keyCabinet-android/app/src/main/res/layout/offline_activation_activity.xml
new file mode 100644
index 0000000..7cccb3f
--- /dev/null
+++ b/keyCabinet-android/app/src/main/res/layout/offline_activation_activity.xml
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout >
+    <data>
+        <import type="com.doumee.lib_coremodel.base.BaseViewModel"/>
+        <import type="android.view.View"/>
+        <variable
+            name="model"
+            type="com.doumee.keyCabinet.ui.face.OfflineActivationVM" />
+    </data>
+    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        tools:context=".ui.face.OfflineActivationActivity">
+
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+            <!--绂荤嚎婵�娲�-->
+            <RelativeLayout
+                android:layout_marginTop="@dimen/start_15"
+                android:id="@+id/accredit_offRl"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+                <LinearLayout
+                    android:id="@+id/accredit_Ll"
+                    android:layout_marginRight="49.3dp"
+                    android:layout_marginLeft="49.3dp"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_centerHorizontal="true"
+                    android:background="@drawable/bg_round_import"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:textSize="20sp"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="20dp"
+                        android:layout_marginTop="@dimen/start_15"
+                        android:text="@string/off_technological_process"
+                        android:textColor="#999999" />
+
+                    <RelativeLayout
+                        android:layout_marginTop="@dimen/start_15"
+                        android:orientation="horizontal"
+                        android:layout_marginRight="20dp"
+                        android:layout_marginLeft="20dp"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content">
+
+                        <TextView
+                            android:id="@+id/activity_hintOne"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="涓�"
+                            android:textColor="#ffffff"
+                            android:textSize="20sp" />
+
+                        <TextView
+                            android:layout_marginLeft="5dp"
+                            android:layout_toRightOf="@+id/activity_hintOne"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:text="@string/off_technological_process_one"
+                            android:textColor="#ffffff"
+                            android:textSize="18sp" />
+                    </RelativeLayout>
+                    <RelativeLayout
+                        android:layout_marginTop="@dimen/start_10"
+                        android:orientation="horizontal"
+                        android:layout_marginRight="20dp"
+                        android:layout_marginLeft="20dp"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content">
+
+                        <TextView
+                            android:id="@+id/activity_hintTwo"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="浜�"
+                            android:textColor="#ffffff"
+                            android:textSize="20sp" />
+
+                        <TextView
+                            android:layout_marginLeft="5dp"
+                            android:layout_toRightOf="@+id/activity_hintTwo"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:text="@string/off_technological_process_two"
+                            android:textColor="#ffffff"
+                            android:textSize="18sp" />
+                    </RelativeLayout>
+                    <RelativeLayout
+                        android:layout_marginTop="@dimen/start_10"
+                        android:orientation="horizontal"
+                        android:layout_marginRight="20dp"
+                        android:layout_marginLeft="20dp"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content">
+
+                        <TextView
+                            android:id="@+id/activity_hintThree"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="涓�"
+                            android:textColor="#ffffff"
+                            android:textSize="20sp" />
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginLeft="5dp"
+                            android:layout_toRightOf="@+id/activity_hintThree"
+                            android:text="@string/off_technological_process_three"
+                            android:textColor="#ffffff"
+                            android:textSize="18sp" />
+                    </RelativeLayout>
+                    <RelativeLayout
+                        android:layout_marginTop="@dimen/start_10"
+                        android:orientation="horizontal"
+                        android:layout_marginRight="20dp"
+                        android:layout_marginLeft="20dp"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content">
+
+                        <TextView
+                            android:id="@+id/activity_hintFour"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="鍥�"
+                            android:textColor="#ffffff"
+                            android:textSize="20sp" />
+
+                        <TextView
+                            android:layout_marginLeft="5dp"
+                            android:layout_toRightOf="@+id/activity_hintFour"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:text="@string/off_technological_process_four"
+                            android:textColor="#ffffff"
+                            android:textSize="18sp" />
+                    </RelativeLayout>
+                    <RelativeLayout
+                        android:layout_marginTop="@dimen/start_10"
+                        android:orientation="horizontal"
+                        android:layout_marginRight="20dp"
+                        android:layout_marginLeft="20dp"
+                        android:layout_marginBottom="@dimen/start_15"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content">
+
+                        <TextView
+                            android:id="@+id/activity_hintFive"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="浜�"
+                            android:textColor="#ffffff"
+                            android:textSize="20sp" />
+
+                        <TextView
+                            android:layout_marginLeft="5dp"
+                            android:layout_toRightOf="@+id/activity_hintFive"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:text="@string/off_technological_process_five"
+                            android:textColor="#ffffff"
+                            android:textSize="18sp" />
+                    </RelativeLayout>
+                </LinearLayout>
+
+                <TextView
+                    android:id="@+id/accredit_setTv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/accredit_Ll"
+                    android:layout_centerHorizontal="true"
+                    android:layout_marginTop="30dp"
+                    android:text="@string/off_local_hardware"
+                    android:textColor="#666666"
+                    android:textSize="20sp" />
+
+                <TextView
+                    android:textSize="20sp"
+                    android:id="@+id/accredit_deviceTv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/accredit_setTv"
+                    android:layout_marginTop="20dp"
+                    android:gravity="center"
+                    android:textColor="@color/white" />
+
+                <View
+                    android:id="@+id/aaccredit_view"
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_below="@+id/accredit_deviceTv"
+                    android:layout_marginLeft="50dp"
+                    android:layout_marginTop="10dp"
+                    android:layout_marginRight="50dp"
+                    android:background="#222222" />
+
+                <TextView
+                    android:layout_marginLeft="49.3dp"
+                    android:layout_marginRight="49.3dp"
+                    android:textSize="@dimen/bottom_font"
+                    android:id="@+id/accredit_hintTv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/aaccredit_view"
+                    android:layout_centerHorizontal="true"
+                    android:layout_marginTop="@dimen/activition_14"
+                    android:textColor="#F34B56" />
+
+                <Button
+                    android:padding="13dp"
+                    android:id="@+id/accredit_offBtn"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/accredit_hintTv"
+                    android:layout_centerHorizontal="true"
+                    android:layout_marginLeft="@dimen/activition_49"
+                    android:layout_marginTop="13dp"
+                    android:layout_marginRight="@dimen/activition_49"
+                    android:background="@mipmap/btn_less_normal"
+                    android:text="@string/accredit_off"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/activition_18_sp" />
+
+                <Button
+                    android:padding="13dp"
+                    android:id="@+id/btn_down"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/accredit_offBtn"
+                    android:layout_centerHorizontal="true"
+                    android:layout_marginLeft="@dimen/activition_49"
+                    android:layout_marginTop="13dp"
+                    android:layout_marginRight="@dimen/activition_49"
+                    android:background="@mipmap/btn_less_normal"
+                    android:text="涓嬭浇婵�娲绘枃浠�"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/activition_18_sp"/>
+            </RelativeLayout>
+        </ScrollView>
+
+        <TextView
+            android:id="@+id/tv_id"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="NO锛�"
+            android:textColor="#ffaaaaaa"
+            android:textSize="18sp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            android:layout_marginLeft="30dp"
+            android:layout_marginBottom="22dp"
+            />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>
\ No newline at end of file
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>

--
Gitblit v1.9.3