MrShi
昨天 9a697d6a8bc05955b9f7322bc86dc3e920e90e14
Merge branch 'wuhuyancao' of http://139.186.142.91:10010/r/productDev/dmvisit into wuhuyancao
已添加8个文件
已修改12个文件
798 ■■■■■ 文件已修改
keyCabinet-android/app/libs/API-20250310.jar 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/libs/simple-xml-2.7.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/AndroidManifest.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/DevConfigBean.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/BatchOpenGridAdminParam.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/OpenGridDriverParam.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationActivity.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/ChoseActivationVM.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationActivity.java 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/OfflineActivationVM.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/KeyCabinetActivity.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/BraceletLogUtils.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/update/FileUtil.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/chose_activation_activity.xml 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/key_cabinet_activity.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/layout/offline_activation_activity.xml 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/src/main/res/values/strings.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
keyCabinet-android/app/libs/API-20250310.jar
Binary files differ
keyCabinet-android/app/libs/simple-xml-2.7.1.jar
Binary files differ
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"/>
        <activity
            android:name="com.doumee.keyCabinet.ui.main.MainActivity"
            android:name=".ui.main.MainActivity"
            android:exported="true"
            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-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-feature android:name="android.hardware.usb.host"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-feature android:name="android.hardware.nfc" />
    <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"
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;
    }
}
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;
    }
}
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;
    }
}
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;
        }
    }
}
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);
    }
}
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);
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("激活失败,设备硬件指纹与License.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("激活失败,设备硬件指纹与License.zip不符");
                                    } else {
                                        getDB().accreditHintTv.setText(code);
                                    }
                                }
                            });
                        }
                    }
                });
                break;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}
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);
    }
}
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);
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) {
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();
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);*/
    }
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();
        }
    }
}
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>
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"
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>
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">在SDK界面中触发离线激活</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>