Browse Source

1.上报开门方式

JaycePC 1 month ago
parent
commit
dd1879253d

+ 1 - 1
app/build.gradle

@@ -19,7 +19,7 @@ android {
         minSdk 31
         targetSdk 35
         versionCode 2
-        versionName "2.11"
+        versionName "2.12"
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         room {

+ 4 - 0
app/src/main/java/xn/xxp/HomeActivity.java

@@ -160,6 +160,10 @@ public class HomeActivity extends BaseCountDownActivity<ActivityHomeBinding> imp
                 if (defaultCdCount >= MAX_UI_DEFAULT) {
                     defaultCdCount = 0;
                     closePersonPanel();
+                    // 防止异常情况门锁没有关闭
+                    if (ActivityUtils.getTopActivity() instanceof HomeActivity) {
+                        Tool.INSTANCE.closeDoor();
+                    }
                 } else {
                     defaultCdCount++;
                 }

+ 18 - 44
app/src/main/java/xn/xxp/app/InitActivity.java

@@ -90,19 +90,27 @@ public class InitActivity extends BaseActivity<ActivityInitBinding> {
 
             @Override
             public void onFinish() {
-                boolean isStorage = Environment.isExternalStorageManager();
-                if (isStorage) {
-                    requestPermission();
-                    storageCD.cancel();
-                    storageCD = null;
-                } else {
-                    storageCD.start();
-                }
+                requestPermission();
             }
         };
         storageCD.start();
     }
 
+    private void requestPermission() {
+        if (!XXPermissions.isGranted(this, Permission.MANAGE_EXTERNAL_STORAGE)
+                || !XXPermissions.isGranted(this, Permission.READ_PHONE_STATE)
+                || !XXPermissions.isGranted(this, Permission.CAMERA)
+                || !XXPermissions.isGranted(this, Permission.RECORD_AUDIO)
+                || !XXPermissions.isGranted(this, Permission.NOTIFICATION_SERVICE)
+        ) {
+            Tool.INSTANCE.getPermission();
+            storageCD.start();
+        } else {
+            storageCD.cancel();
+            runTask();
+        }
+    }
+
     @Override
     protected void initListener() {
         super.initListener();
@@ -129,41 +137,6 @@ public class InitActivity extends BaseActivity<ActivityInitBinding> {
         super.initData();
     }
 
-    private void requestPermission() {
-        XXPermissions.with(this)
-                .permission(Permission.MANAGE_EXTERNAL_STORAGE)
-                .permission(Permission.CAMERA)
-                .permission(Permission.READ_PHONE_STATE)
-                .permission(Permission.RECORD_AUDIO)
-                .request(new OnPermissionCallback() {
-                    @Override
-                    public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
-                        if (allGranted) {
-                            runTask();
-                        } else {
-                            new AlertDialog.Builder(InitActivity.this)
-                                    .setTitle("提示").setMessage("您必须同意所有权限才可以继续使用")
-                                    .setNegativeButton("确定", (dialogInterface, i) -> requestPermission()).show();
-                        }
-                    }
-
-                    @Override
-                    public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
-                        LogUtils.d(permissions, doNotAskAgain);
-                        if (doNotAskAgain) {
-                            new AlertDialog.Builder(InitActivity.this)
-                                    .setTitle("提示").setMessage("您必须同意所有权限才可以继续使用")
-                                    .setNegativeButton("确定", (dialogInterface, i)
-                                            -> XXPermissions.startPermissionActivity(InitActivity.this, permissions)).show();
-                        } else {
-                            new AlertDialog.Builder(InitActivity.this)
-                                    .setTitle("提示").setMessage("您必须同意所有权限才可以继续使用")
-                                    .setNegativeButton("确定", (dialogInterface, i) -> requestPermission()).show();
-                        }
-                    }
-                });
-    }
-
     private ThreadUtils.SimpleTask<Object> simpleTask;
 
     private void runTask() {
@@ -199,12 +172,13 @@ public class InitActivity extends BaseActivity<ActivityInitBinding> {
             @Override
             public Object doInBackground() throws Throwable {
                 SyncFaceTool.INSTANCE.doWork();
+                LogUtils.d("人脸同步结束");
                 return null;
             }
 
             @Override
             public void onSuccess(Object result) {
-                LogUtils.json(RoomTool.getInstance().faceDao().getAll());
+                LogUtils.json("人脸数据库", RoomTool.getInstance().faceDao().getAll());
                 ActivityUtils.startActivity(HomeActivity.class);
                 finish();
             }

+ 313 - 0
app/src/main/java/xn/xxp/app/XZ.java

@@ -0,0 +1,313 @@
+//package xn.xxp.app;
+//
+//import android.annotation.SuppressLint;
+//import android.app.Activity;
+//import android.app.DownloadManager;
+//import android.content.Context;
+//import android.net.Uri;
+//import android.os.Environment;
+//import android.os.FileObserver;
+//import android.util.Log;
+//
+//import androidx.annotation.NonNull;
+//import androidx.annotation.Nullable;
+//import androidx.annotation.WorkerThread;
+//import androidx.core.util.Pair;
+//
+//import com.blankj.utilcode.util.ActivityUtils;
+//import com.blankj.utilcode.util.FileUtils;
+//import com.blankj.utilcode.util.GsonUtils;
+//import com.blankj.utilcode.util.LogUtils;
+//import com.blankj.utilcode.util.ThreadUtils;
+//import com.blankj.utilcode.util.Utils;
+//import com.google.gson.reflect.TypeToken;
+//import com.njlz.event.BuildModelEvent;
+//import com.njlz.face.FaceUtils;
+//import com.njlz.smartdata.FaceBuildBean;
+//import com.njlz.smartdata.FaceConfig;
+//
+//import org.greenrobot.eventbus.EventBus;
+//import org.greenrobot.eventbus.Subscribe;
+//import org.greenrobot.eventbus.ThreadMode;
+//import org.json.JSONObject;
+//
+//import java.io.File;
+//import java.lang.reflect.Type;
+//import java.util.ArrayList;
+//import java.util.LinkedHashMap;
+//import java.util.LinkedList;
+//import java.util.List;
+//import java.util.Map;
+//
+//import http.client.HttpTool;
+//import okhttp3.Response;
+//import xn.xxp.home.auth.ChoiceAuthActivity;
+//import xn.xxp.home.setting.FaceListActivity;
+//import xn.xxp.room.RoomTool;
+//import xn.xxp.room.bean.Face;
+//import xn.xxp.room.dao.FaceDao;
+//
+//public enum SyncFaceTool {
+//    INSTANCE;
+//
+//    private DownloadManager downloadManager;
+//    private long lastEventTime = 0;
+//    private long lastBuildTime = 0;
+//    private volatile boolean isBuildFaceEnd = false;
+//    private List<Face> faceList;
+//    public volatile boolean isSyncFace = false;
+//
+//    SyncFaceTool() {
+//
+//    }
+//
+//    @WorkerThread
+//    public void doWork() {
+//        if (ThreadUtils.isMainThread()) {
+//            LogUtils.e("该方法必须在子线程调用");
+//            return;
+//        }
+//        Activity topActivity = ActivityUtils.getTopActivity();
+//        if (topActivity instanceof ChoiceAuthActivity) {
+//            LogUtils.d("人脸识别中,不去同步人脸!");
+//            return;
+//        }
+//        if (topActivity instanceof FaceListActivity) {
+//            LogUtils.d("正在查阅底库,不去同步人脸!");
+//            return;
+//        }
+//        if (isSyncFace) {
+//            LogUtils.d("正在同步人脸");
+//            return;
+//        }
+//        if (null == downloadManager) {
+//            downloadManager = (DownloadManager) Utils.getApp().getApplicationContext().getSystemService(Context.DOWNLOAD_SERVICE);
+//        }
+//        // 初始化
+//        isSyncFace = true;
+//        try {
+//            // 同步人脸
+//            FaceUtils.getInstance().init(Utils.getApp());
+//            FaceConfig faceConfig = FaceUtils.getInstance().getFaceConfig();
+//            LogUtils.json("底库配置", faceConfig);
+//            EventBus.getDefault().register(this);
+//            // http请求同步
+//            List<Pair<String, String>> faceUrlList = getLabFaceList();
+//            if (null != faceUrlList && !faceUrlList.isEmpty()) {
+//                // 下载人脸
+//                List<FaceBuildBean> faceBuildBeanList = downloadPicAndBuild(faceUrlList);
+//                LogUtils.json("需要变更的人脸", faceBuildBeanList);
+//                // 人脸建模
+//                if (null != faceBuildBeanList && !faceBuildBeanList.isEmpty()) {
+//                    FaceUtils.getInstance().faceBuild(faceBuildBeanList);
+//                    lastBuildTime = System.currentTimeMillis();
+//                    // 等待人脸建模
+//                    while (!isBuildFaceEnd) {
+//                        Thread.sleep(10);
+//                        if (System.currentTimeMillis() - lastBuildTime > 2000) {
+//                            isBuildFaceEnd = true;
+//                        }
+//                    }
+//                }
+//                LogUtils.json(RoomTool.getInstance().faceDao().getAll());
+//            } else {
+//                LogUtils.d("不需要下载变更人脸");
+//            }
+//            // 删除本地多余的人脸
+//            delRedundantFace();
+//            LogUtils.d("底库", FaceUtils.getInstance().getAllFaceId());
+//        } catch (Exception e) {
+//            LogUtils.e(Log.getStackTraceString(e));
+//        } finally {
+//            try {
+//                // 销毁
+//                EventBus.getDefault().unregister(this);
+//                FaceUtils.getInstance().destroy();
+//            } catch (Exception e) {
+//                LogUtils.e(Log.getStackTraceString(e));
+//            }
+//        }
+//        isSyncFace = false;
+//    }
+//
+//    private List<Pair<String, String>> getLabFaceList() {
+//        try {
+//            Response response = HttpTool.getLabFaceList();
+//            if (null != response && response.isSuccessful()) {
+//                String json = response.body().string();
+//                JSONObject jsonObject = new JSONObject(json);
+//                int code = jsonObject.getInt("code");
+//                if (200 == code) {
+//                    Type faceListType = new TypeToken<List<Face>>() {
+//                    }.getType();
+//                    faceList = GsonUtils.fromJson(jsonObject.getJSONArray("data").toString(), faceListType);
+//
+//                    if (null != faceList && !faceList.isEmpty()) {
+//                        FaceDao faceDao = RoomTool.getInstance().faceDao();
+//                        @SuppressLint("SdCardPath") final String savePath = "/sdcard/facePic/";
+//                        FileUtils.createOrExistsDir(savePath);
+//                        // 1.id 2.url
+//                        List<Pair<String, String>> faceUrlList = new ArrayList<>();
+//                        List<String> allFaceIdList = FaceUtils.getInstance().getAllFaceId();
+//                        for (int i = 0; i < faceList.size(); i++) {
+//                            Face face = faceList.get(i);
+//                            Face sqlFace = faceDao.getById(face.getUserId());
+//                            if (null != sqlFace) {
+//                                boolean sqlInDb = false;
+//                                for (int j = 0; j < allFaceIdList.size(); j++) {
+//                                    if (allFaceIdList.get(j).equals(String.valueOf(sqlFace.getUserId()))) {
+//                                        sqlInDb = true;
+//                                    }
+//                                }
+//
+//                                if (sqlInDb && face.getLastUpdated() <= sqlFace.getLastUpdated()) {
+//                                    continue;
+//                                }
+//                            }
+//                            faceUrlList.add(Pair.create(String.valueOf(face.getUserId()), HttpTool.checkUrl(face.getFaceUrl())));
+//                        }
+//                        return faceUrlList;
+//                    } else {
+//                        return new ArrayList<>();
+//                    }
+//                }
+//            }
+//        } catch (Exception e) {
+//            LogUtils.e(Log.getStackTraceString(e));
+//        }
+//        return null;
+//    }
+//
+//    private List<FaceBuildBean> downloadPicAndBuild(List<Pair<String, String>> faceUrlList) {
+//        if (null == faceUrlList || faceUrlList.isEmpty()) {
+//            return null;
+//        }
+//        try {
+//            @SuppressLint("SdCardPath") final String filePathDir = "/sdcard/" + Environment.DIRECTORY_DOWNLOADS + "/facePic/";
+//            FileUtils.createOrExistsDir(filePathDir);
+//            FileUtils.deleteAllInDir(filePathDir);
+//            List<FaceBuildBean> faceBuildBeanList = new ArrayList<>();
+//            List<File> downloadList = new LinkedList<>();
+//            for (int i = 0; i < faceUrlList.size(); i++) {
+//                // 1.id 2.url
+//                Pair<String, String> downloadPair = faceUrlList.get(i);
+//                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadPair.second));
+//                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "facePic/" + downloadPair.first + ".jpg");
+//                request.setMimeType("image/jpeg");
+//                request.setVisibleInDownloadsUi(false);
+//                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
+//                downloadManager.enqueue(request);
+//                downloadList.add(new File(filePathDir + downloadPair.first + ".jpg"));
+//            }
+//            // 文件观察者
+//            FileObserver fileObserver = getFileObserver(filePathDir, downloadList);
+//            // 开始观察
+//            fileObserver.startWatching();
+//            lastEventTime = System.currentTimeMillis();
+//            // 观察者无响应2秒后 认为下载结束
+//            while (!downloadList.isEmpty()) {
+//                Thread.sleep(1000);
+//                if (System.currentTimeMillis() - lastEventTime > 2000) {
+//                    downloadList.clear();
+//                }
+//            }
+//            // 停止观察
+//            fileObserver.stopWatching();
+//
+//            // 同步人脸
+//            List<File> facePicList = FileUtils.listFilesInDir(filePathDir);
+//            if (!facePicList.isEmpty()) {
+//                for (int i = 0; i < facePicList.size(); i++) {
+//                    File file = facePicList.get(i);
+//                    FaceBuildBean faceBuildBean = new FaceBuildBean();
+//                    faceBuildBean.setPicPath(file.getAbsolutePath());
+//                    faceBuildBean.setFaceUuid(file.getName().replace(".jpg", ""));
+//                    faceBuildBeanList.add(faceBuildBean);
+//                }
+//            }
+//            return faceBuildBeanList;
+//        } catch (Exception e) {
+//            LogUtils.e(Log.getStackTraceString(e));
+//        }
+//        return null;
+//    }
+//
+//    @Subscribe(threadMode = ThreadMode.ASYNC)
+//    public void onReceive(BuildModelEvent buildModelEvent) {
+//        if (buildModelEvent.isDone()) {
+//            List<FaceBuildBean> list = FaceUtils.getInstance().getFaceResult();
+//            FaceDao faceDao = RoomTool.getInstance().faceDao();
+//            if (list != null && !list.isEmpty()) {
+//                for (FaceBuildBean faceBuildBean : list) {
+//                    if (faceBuildBean.getErrCode() != 0) {
+//                        LogUtils.e("建模失败", faceBuildBean.getFaceUuid(), faceBuildBean.getErrCode());
+//                    } else {
+//                        if (null != faceList && !faceList.isEmpty()) {
+//                            long uuid = Long.parseLong(faceBuildBean.getFaceUuid());
+//                            for (int i = 0; i < faceList.size(); i++) {
+//                                Face face = faceList.get(i);
+//                                if (face.getUserId() == uuid) {
+//                                    faceDao.insertAll(face);
+//                                }
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//            isBuildFaceEnd = true;
+//        }
+//        lastBuildTime = System.currentTimeMillis();
+//    }
+//
+//    private @NonNull FileObserver getFileObserver(String filePathDir, List<File> downloadList) {
+//        return new FileObserver(filePathDir) {
+//            final Map<String, Integer> fileStateMap = new LinkedHashMap<>();
+//
+//            @Override
+//            public void onEvent(int event, @Nullable String path) {
+//                lastEventTime = System.currentTimeMillis();
+//                if (null != path) {
+//                    if (event == CLOSE_WRITE) {
+//                        Integer count = fileStateMap.get(path);
+//                        if (null == count) {
+//                            fileStateMap.put(path, 1);
+//                        } else if (count >= 2) {
+//                            downloadList.removeIf(file -> path.equals(file.getName()));
+//                        } else {
+//                            fileStateMap.put(path, count + 1);
+//                        }
+//                    }
+//                }
+//            }
+//        };
+//    }
+//
+//    /**
+//     * 删除本地多余的人脸
+//     */
+//    private void delRedundantFace() {
+//        List<String> allFaceIdList = FaceUtils.getInstance().getAllFaceId();
+//        FaceDao faceDao = RoomTool.getInstance().faceDao();
+//        if (faceList != null && allFaceIdList != null && !allFaceIdList.isEmpty()) {
+//            if (faceList.isEmpty()) {
+//                FaceUtils.getInstance().deleteAllFace();
+//                faceDao.clear();
+//            } else {
+//                for (int i = 0; i < allFaceIdList.size(); i++) {
+//                    String uuid = allFaceIdList.get(i);
+//                    boolean hasFace = false;
+//                    for (int j = 0; j < faceList.size(); j++) {
+//                        if (faceList.get(j).getUserId() == Long.parseLong(uuid)) {
+//                            hasFace = true;
+//                            break;
+//                        }
+//                    }
+//                    if (!hasFace) {
+//                        FaceUtils.getInstance().deleteFace(uuid);
+//                        faceDao.delete(Long.parseLong(uuid));
+//                    }
+//                }
+//            }
+//        }
+//    }
+//}

+ 0 - 1
app/src/main/java/xn/xxp/home/auth/ChoiceAuthActivity.java

@@ -116,7 +116,6 @@ public class ChoiceAuthActivity extends BaseSignActivity<ActivityAuthChoiceBindi
             Intent getIntent = new Intent(ChoiceAuthActivity.this, MainActivity.class);
             getIntent.putExtra("authType", authType);
             startActivity(getIntent);
-
             finish();
         } else if (accessVerify.equals(AccessVerify.SIGN_IN.getType())) {
             dispatchSignIn(authType);

+ 2 - 1
app/src/main/java/xn/xxp/home/sign/SafetyCheckFragment.kt

@@ -357,7 +357,8 @@ class SafetyCheckFragment :
 
     private fun callSignInSubmitApi() {
         showLoading("签到中...")
-        val disposable = if (SignType.PATROL.code == mSignTyp) {
+        val isPatrol = SignType.PATROL.code == mSignTyp
+        val disposable = if (isPatrol) {
             val param = PatrolSignInReq().apply {
                 num = deviceConfig.devId
                 userId = LabApp.userVo.userId

+ 2 - 2
app/src/main/java/xn/xxp/mqtt/MqttManager.kt

@@ -143,8 +143,8 @@ class MqttManager private constructor() {
                     val messageId: Long = jsonObject.getLong("messageId")
                     val deviceNo: String = jsonObject.getString("deviceNo")
                     if (deviceNo == deviceConfig.devId) {
-                        val status = Tool.INSTANCE.openDoor(null, null)
-                        if (2 != status) {
+                        val status = Tool.INSTANCE.openDoor( null, null)
+                        if (2 == status) {
                             LogUtils.d("开锁中")
                         } else {
                             AsyncTask.execute { HttpTool.remoteUnlock(messageId) }

+ 10 - 1
app/src/main/java/xn/xxp/utils/Tool.java

@@ -75,6 +75,8 @@ public enum Tool {
     private volatile boolean isLocking = false;
 
     /**
+     * 正常开门
+     *
      * @param openType 开门类型
      * @return 0 开锁失败
      * 1 开锁成功
@@ -105,13 +107,20 @@ public enum Tool {
                 @Override
                 public void onSuccess(Object result) {
                     isLocking = false;
-                    DeviceUtils.setElectricLock(1, false);
+                    closeDoor();
                 }
             }, 5, TimeUnit.SECONDS);
         }
         return status;
     }
 
+    /**
+     * 关门
+     */
+    public void closeDoor() {
+        DeviceUtils.setElectricLock(1, false);
+    }
+
     public int dip2px(float dp) {
         float scale = Utils.getApp().getResources().getDisplayMetrics().density;
         float px = dp * scale + 0.5F;