Ver código fonte

refactor(更新) :
- 退出登录时钥匙仓位锁定还是要请求后端
- 人脸提示新增

周文健 5 meses atrás
pai
commit
df4f21d966

+ 11 - 1
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -1950,7 +1950,17 @@ object BusinessManager {
             .forEach { dockBean ->
                 dockBean.getKeyList().forEach { key ->
                     if (key.isExist) {
-                        ModBusController.controlKeyBuckle(false, key.isLeft, dockBean.addr)
+                        NetApi.getKeyInfo(key.rfid.toString()) {
+                            if (it != null && !it.macAddress.isNullOrEmpty()) {
+                                ModBusController.updateKeyMac(
+                                    dockBean.addr, key.isLeft, it.macAddress
+                                )
+                            } else {
+                                ModBusController.controlKeyBuckle(
+                                    true, key.isLeft, dockBean.addr
+                                )
+                            }
+                        }
                     } else {
                         ModBusController.controlKeyBuckle(true, key.isLeft, dockBean.addr)
                     }

+ 22 - 6
app/src/main/java/com/grkj/iscs/util/ArcSoftUtil.kt

@@ -94,7 +94,12 @@ object ArcSoftUtil {
         }
     }
 
-    fun initCamera(context: Context, windowManager: WindowManager, preview: View, callBack: (Bitmap?) -> Unit) {
+    fun initCamera(
+        context: Context,
+        windowManager: WindowManager,
+        preview: View,
+        callBack: (Bitmap?, Int, Boolean) -> Unit
+    ) {
         val metrics = DisplayMetrics()
         windowManager.defaultDisplay.getMetrics(metrics)
 
@@ -119,7 +124,7 @@ object ArcSoftUtil {
                     FaceEngine.CP_PAF_NV21,
                     faceInfoList
                 )
-                if (code == ErrorInfo.MOK && faceInfoList.size > 0) {
+                if (code == ErrorInfo.MOK && faceInfoList.isNotEmpty()) {
                     code = faceEngine!!.process(
                         nv21,
                         previewSize!!.width,
@@ -146,16 +151,22 @@ object ArcSoftUtil {
 
                 // 有其中一个的错误码不为ErrorInfo.MOK,return
                 if ((ageCode or genderCode or face3DAngleCode or livenessCode) != ErrorInfo.MOK) {
+                    LogUtil.d("人脸检测结果:年龄、性别、角度、获取验证失败")
                     return
                 }
 
                 // 自己加的,必须有活体检测
                 if (faceLivenessInfoList.none { it.liveness == LivenessInfo.ALIVE }) {
+                    callBack(null, faceInfoList.size, false)
                     return
                 }
-                val bitmap = NV21ToBitmap(context).nv21ToBitmap(nv21, previewSize!!.width, previewSize!!.height)
-                LogUtil.i("识别结果 : ${bitmap == null} - $faceInfoList")
-                callBack(bitmap)
+                val bitmap = NV21ToBitmap(context).nv21ToBitmap(
+                    nv21,
+                    previewSize!!.width,
+                    previewSize!!.height
+                )
+                LogUtil.d("人脸检测结果-识别结果 : ${bitmap == null} - $faceInfoList")
+                callBack(bitmap, faceInfoList.size, true)
             }
 
             override fun onCameraClosed() {
@@ -182,7 +193,12 @@ object ArcSoftUtil {
         cameraHelper!!.start()
     }
 
-    fun start(context: Context, windowManager: WindowManager, preview: View, callBack: (Bitmap?) -> Unit) {
+    fun start(
+        context: Context,
+        windowManager: WindowManager,
+        preview: View,
+        callBack: (Bitmap?, Int, Boolean) -> Unit
+    ) {
         initEngine(context)
         initCamera(context, windowManager, preview, callBack)
     }

+ 18 - 1
app/src/main/java/com/grkj/iscs/view/dialog/FaceCaptureDialog.kt

@@ -2,10 +2,12 @@ package com.grkj.iscs.view.dialog
 
 import android.graphics.Bitmap
 import android.view.View
+import androidx.core.view.isVisible
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFaceCaptureBinding
 import com.grkj.iscs.util.ArcSoftUtil
 import com.grkj.iscs.util.ToastUtils
+import com.grkj.iscs.util.log.LogUtil
 import com.grkj.iscs.view.base.BaseActivity
 import com.grkj.iscs.view.base.BaseDialog
 
@@ -56,7 +58,22 @@ class FaceCaptureDialog(val ctx: BaseActivity<*>, var callback: (Bitmap?) -> Uni
 
     private fun startFace() {
         ArcSoftUtil.initEngine(context)
-        ArcSoftUtil.initCamera(context, ctx.windowManager, mBinding?.preview!!) { bitmap ->
+        ArcSoftUtil.initCamera(
+            context,
+            ctx.windowManager,
+            mBinding?.preview!!
+        ) { bitmap, faceSize, alive ->
+            mBinding?.tipTv?.isVisible = faceSize > 1 || alive == false
+            LogUtil.i("人脸检测结果: ${bitmap == null},$faceSize,$alive")
+            if (faceSize > 1) {
+                mBinding?.tipTv?.text = context.getString(R.string.only_one_person_allowed)
+                return@initCamera
+            }
+            if (alive == false) {
+                mBinding?.tipTv?.text =
+                    context.getString(R.string.real_person_verification_required)
+                return@initCamera
+            }
             ArcSoftUtil.stop()
             mBinding?.preview?.visibility = View.INVISIBLE
             mBinding?.image?.visibility = View.VISIBLE

+ 14 - 2
app/src/main/java/com/grkj/iscs/view/dialog/LoginDialog.kt

@@ -129,8 +129,20 @@ class LoginDialog(
 
     private fun startFace() {
         ArcSoftUtil.initEngine(context)
-        ArcSoftUtil.initCamera(context, ctx.windowManager, mBinding?.preview!!) {
-            it?.let { itBitmap ->
+        ArcSoftUtil.initCamera(
+            context,
+            ctx.windowManager,
+            mBinding?.preview!!
+        ) { bitmap, faceSize, alive ->
+            bitmap?.let { itBitmap ->
+                if (faceSize>1){
+                    ToastUtils.tip(R.string.only_one_person_allowed)
+                    return@initCamera
+                }
+                if (alive==false){
+                    ToastUtils.tip(R.string.real_person_verification_required)
+                    return@initCamera
+                }
                 BusinessManager.sendLoadingEventMsg(context.getString(R.string.face_detected_do_login))
                 ArcSoftUtil.stop()
                 presenter?.faceLogin(itBitmap) { isSuccess, userInfoRespVO ->

+ 16 - 0
app/src/main/res/layout/dialog_face_capture.xml

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <com.google.android.material.card.MaterialCardView 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="wrap_content"
     android:layout_height="wrap_content"
     android:gravity="center"
@@ -74,6 +75,7 @@
                 android:layout_marginHorizontal="@dimen/common_spacing_small"
                 android:layout_weight="1"
                 android:background="@drawable/face_capture_tip_bg">
+
                 <TextureView
                     android:id="@+id/preview"
                     android:layout_width="match_parent"
@@ -85,6 +87,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="match_parent"
                     android:scaleType="centerCrop" />
+
             </FrameLayout>
 
             <LinearLayout
@@ -122,6 +125,19 @@
                     android:text="@string/capture_tip_content"
                     android:textColor="@color/black"
                     android:textSize="@dimen/common_text_size_small" />
+
+                <TextView
+                    android:id="@+id/tip_tv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:background="@color/common_status_red"
+                    android:gravity="center"
+                    android:text="@string/only_one_person_allowed"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/common_text_size_big"
+                    android:visibility="gone"
+                    tools:text="请保证画面中只有自己" />
             </LinearLayout>
         </LinearLayout>
     </RelativeLayout>

+ 2 - 0
app/src/main/res/values-en/strings.xml

@@ -362,4 +362,6 @@
     <string name="ticket_data_error">job ticket data error</string>
     <string name="card_invalid">This card is invalid</string>
     <string name="lock_nfc_not_correct">该nfc无对应的挂锁信息</string>
+    <string name="only_one_person_allowed">Only one person allowed</string>
+    <string name="real_person_verification_required">Real-person verification required</string>
 </resources>

+ 2 - 0
app/src/main/res/values-zh/strings.xml

@@ -362,4 +362,6 @@
     <string name="ticket_data_error">工作票数据损坏</string>
     <string name="card_invalid">该卡无效</string>
     <string name="lock_nfc_not_correct">该nfc无对应的挂锁信息</string>
+    <string name="only_one_person_allowed">请保持单人入镜</string>
+    <string name="real_person_verification_required">请保持真人操作</string>
 </resources>

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -362,4 +362,6 @@
     <string name="ticket_data_error">工作票数据损坏</string>
     <string name="card_invalid">该卡无效</string>
     <string name="lock_nfc_not_correct">该nfc无对应的挂锁信息</string>
+    <string name="only_one_person_allowed">请保持单人入镜</string>
+    <string name="real_person_verification_required">请保持真人操作</string>
 </resources>