瀏覽代碼

完成人脸登录功能;修复作业票工作进度页“待共锁”状态显示异常

Frankensteinly 7 月之前
父節點
當前提交
d6139c3014

+ 5 - 0
app/src/main/java/com/grkj/iscs/model/UrlConsts.kt

@@ -251,4 +251,9 @@ object UrlConsts {
      * 新增人脸录入-人脸识别后裁剪存储-arcsoft
      */
     const val INSERT_FACE = "/system/user/characteristic/insertUserFace"
+
+    /**
+     * 系统用户登录-face登录-arcsoft
+     */
+    const val LOGIN_FACE = "/loginByArcFace"
 }

+ 1 - 1
app/src/main/java/com/grkj/iscs/model/vo/finger/LoginFingerprintRespVO.kt → app/src/main/java/com/grkj/iscs/model/vo/finger/LoginCharacteristicRespVO.kt

@@ -1,6 +1,6 @@
 package com.grkj.iscs.model.vo.finger
 
-data class LoginFingerprintRespVO(
+data class LoginCharacteristicRespVO(
     val msg: String?,
     val code: Int?,
     val nickName: String?,

+ 22 - 3
app/src/main/java/com/grkj/iscs/util/NetApi.kt

@@ -9,7 +9,7 @@ import com.grkj.iscs.model.vo.card.CardInfoRespVO
 import com.grkj.iscs.model.vo.characteristic.CharacteristicPageRespVO
 import com.grkj.iscs.model.vo.dept.DeptListRespVO
 import com.grkj.iscs.model.vo.dict.CommonDictRespVO
-import com.grkj.iscs.model.vo.finger.LoginFingerprintRespVO
+import com.grkj.iscs.model.vo.finger.LoginCharacteristicRespVO
 import com.grkj.iscs.model.vo.key.KeyInfoRespVO
 import com.grkj.iscs.model.vo.lock.LockInfoRespVO
 import com.grkj.iscs.model.vo.lock.LockTakeUpdateReqVO
@@ -34,7 +34,6 @@ import com.grkj.iscs.model.vo.user.UserInfoRespVO
 import com.grkj.iscs.model.vo.user.UserListRespVO
 import com.grkj.iscs.util.log.LogUtil
 import java.text.SimpleDateFormat
-import java.time.LocalDateTime
 import java.util.Calendar
 import java.util.Locale
 
@@ -850,7 +849,7 @@ object NetApi {
             mapOf<String, String>(),
             { res, _, _ ->
                 res?.let {
-                    val resp: LoginFingerprintRespVO? = it.toBean(LoginFingerprintRespVO::class.java)
+                    val resp: LoginCharacteristicRespVO? = it.toBean(LoginCharacteristicRespVO::class.java)
                     Token(resp?.token!!, 0).saveToSp(MyApplication.instance!!.applicationContext)
                     callBack.invoke(true)
                 } ?: run {
@@ -977,4 +976,24 @@ object NetApi {
             }, isGet = false, isAuth = true, fileList = fileList
         )
     }
+
+    /**
+     * 系统用户登录-face登录-arcsoft
+     */
+    fun loginByFace(fileList: MutableList<FileStreamReqParam>, callBack: (Boolean) -> Unit) {
+        NetHttpManager.getInstance().doRequestNet(
+            UrlConsts.LOGIN_FACE,
+            false,
+            mapOf<String, String>(),
+            { res, _, _ ->
+                res?.let {
+                    val resp: LoginCharacteristicRespVO? = it.toBean(LoginCharacteristicRespVO::class.java)
+                    Token(resp?.token!!, 0).saveToSp(MyApplication.instance!!.applicationContext)
+                    callBack.invoke(true)
+                } ?: run {
+                    callBack.invoke(false)
+                }
+            }, isGet = false, isAuth = false, fileList = fileList
+        )
+    }
 }

+ 16 - 8
app/src/main/java/com/grkj/iscs/view/activity/test/face/FaceDetectorHelper.kt

@@ -58,6 +58,7 @@ class FaceDetectorHelper(
     fun startPreview(
         activity: ComponentActivity,
         view: PreviewView,
+        isPreview: Boolean = true,
         callback: Consumer<Bitmap>
     ) {
         val cameraProviderFuture = ProcessCameraProvider.getInstance(activity)
@@ -66,12 +67,14 @@ class FaceDetectorHelper(
             // 消除了打开和关闭相机的任务,因为 CameraX 具有生命周期感知能力
             mCameraProvider = cameraProviderFuture.get()
 
-            // 预览
-            imagePreview = Preview.Builder()
-                .build()
-                .also {
-                    it.setSurfaceProvider(view.surfaceProvider)
-                }
+            if (isPreview) {
+                // 预览
+                imagePreview = Preview.Builder()
+                    .build()
+                    .also {
+                        it.setSurfaceProvider(view.surfaceProvider)
+                    }
+            }
 
             // 配置图像分析
             imageAnalysis = ImageAnalysis.Builder()
@@ -87,8 +90,13 @@ class FaceDetectorHelper(
                 mCameraProvider.unbindAll()
 
                 // 将相机绑定到 lifecycleOwner,就不用手动关闭了
-                mCameraProvider.bindToLifecycle(
-                    activity, cameraSelector, imagePreview, imageAnalysis)
+                if (isPreview) {
+                    mCameraProvider.bindToLifecycle(
+                        activity, cameraSelector, imagePreview, imageAnalysis)
+                } else {
+                    mCameraProvider.bindToLifecycle(
+                        activity, cameraSelector, imageAnalysis)
+                }
 
             } catch(exc: Exception) {
                 Log.e("TAG", "Use case binding failed", exc)

+ 34 - 15
app/src/main/java/com/grkj/iscs/view/dialog/LoginDialog.kt

@@ -1,6 +1,5 @@
 package com.grkj.iscs.view.dialog
 
-import android.content.Context
 import android.graphics.Bitmap
 import android.view.InputDevice
 import android.view.KeyEvent
@@ -9,18 +8,17 @@ import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogLoginBinding
 import com.grkj.iscs.extentions.toByteArrays
 import com.grkj.iscs.extentions.toHexStrings
-import com.grkj.iscs.model.vo.FileStreamReqParam
 import com.grkj.iscs.model.vo.card.CardInfoRespVO
 import com.grkj.iscs.model.vo.user.UserInfoRespVO
-import com.grkj.iscs.util.CommonUtils
 import com.grkj.iscs.util.Executor
 import com.grkj.iscs.util.FingerprintUtil
-import com.grkj.iscs.util.NetApi
 import com.grkj.iscs.util.log.LogUtil
+import com.grkj.iscs.view.activity.test.face.FaceDetectorHelper
+import com.grkj.iscs.view.base.BaseActivity
 import com.grkj.iscs.view.base.BaseDialog
 import com.grkj.iscs.view.presenter.LoginPresenter
 
-class LoginDialog(val presenter: LoginPresenter?, val ctx: Context, private var callBack: ((Boolean, CardInfoRespVO?, UserInfoRespVO?) -> Unit)? = null) :
+class LoginDialog(val presenter: LoginPresenter?, val ctx: BaseActivity<*>, private var callBack: ((Boolean, CardInfoRespVO?, UserInfoRespVO?) -> Unit)? = null) :
     BaseDialog<DialogLoginBinding>(ctx) {
 
     private var cardNo = ""
@@ -30,6 +28,9 @@ class LoginDialog(val presenter: LoginPresenter?, val ctx: Context, private var
         Pair(context.getString(R.string.please_scan_fingerprint), R.mipmap.login_fingerprint),
         Pair(context.getString(R.string.please_swipe_card), R.mipmap.login_card)
     )
+    private val faceDetectorHelper by lazy {
+        FaceDetectorHelper()
+    }
 
     override val viewBinding: DialogLoginBinding
         get() = DialogLoginBinding.inflate(layoutInflater)
@@ -63,19 +64,37 @@ class LoginDialog(val presenter: LoginPresenter?, val ctx: Context, private var
             mBinding?.llEasyContainer?.visibility = View.VISIBLE
             mBinding?.ivIcon?.setImageResource(mPairList[loginType].second)
             mBinding?.tvTip?.text = mPairList[loginType].first
-            if (loginType == 1) {
-                FingerprintUtil.init(ctx)
-                FingerprintUtil.start()
-                FingerprintUtil.setScanListener(object : FingerprintUtil.OnScanListener {
-                    override fun onScan(bitmap: Bitmap) {
-                        presenter?.fingerprintLogin(bitmap) { isSuccess, cardInfoRespVO, userInfoRespVO ->
-                            if (isSuccess) {
-                                dismiss()
+            when (loginType) {
+                0 -> {
+                    faceDetectorHelper.startPreview(ctx, mBinding?.preview!!, false) {
+                        // 注意切换线程
+                        Executor.runOnMain {
+                            mBinding?.preview?.visibility = View.INVISIBLE
+                            faceDetectorHelper.stopDetector()
+                            presenter?.faceLogin(it) { isSuccess, cardInfoRespVO, userInfoRespVO ->
+                                if (isSuccess) {
+                                    dismiss()
+                                }
+                                callBack?.invoke(isSuccess, cardInfoRespVO, userInfoRespVO)
                             }
-                            callBack?.invoke(isSuccess, cardInfoRespVO, userInfoRespVO)
                         }
                     }
-                })
+                    faceDetectorHelper.startDetector()
+                }
+                1 -> {
+                    FingerprintUtil.init(ctx)
+                    FingerprintUtil.start()
+                    FingerprintUtil.setScanListener(object : FingerprintUtil.OnScanListener {
+                        override fun onScan(bitmap: Bitmap) {
+                            presenter?.fingerprintLogin(bitmap) { isSuccess, cardInfoRespVO, userInfoRespVO ->
+                                if (isSuccess) {
+                                    dismiss()
+                                }
+                                callBack?.invoke(isSuccess, cardInfoRespVO, userInfoRespVO)
+                            }
+                        }
+                    })
+                }
             }
         }
         show()

+ 1 - 1
app/src/main/java/com/grkj/iscs/view/fragment/JobProgressFragment.kt

@@ -71,7 +71,7 @@ class JobProgressFragment(val goBack: () -> Unit) :
             object : CommonAdapter<TicketDetailMonitorRespVO.IsJobTicketUser>(requireActivity(), R.layout.item_rv_worker_status, mUserList) {
                 override fun convert(holder: ViewHolder, user: TicketDetailMonitorRespVO.IsJobTicketUser, position: Int) {
                     holder.setText(R.id.tv_name, user.userName)
-                    holder.setVisible(R.id.iv_ready_to_lock, user.jobStatus!! >= 3 || mStep == 6)
+                    holder.setVisible(R.id.iv_ready_to_lock, user.jobStatus!! >= 3 || mStep >= 4)
                     holder.setVisible(R.id.iv_locked, user.jobStatus >= 4)
                     holder.setVisible(R.id.iv_unlocked, user.jobStatus >= 5)
                 }

+ 21 - 0
app/src/main/java/com/grkj/iscs/view/presenter/LoginPresenter.kt

@@ -88,6 +88,27 @@ class LoginPresenter : BasePresenter<ILoginView>() {
         }
     }
 
+    fun faceLogin(bitmap: Bitmap, callBack: (Boolean, CardInfoRespVO?, UserInfoRespVO?) -> Unit) {
+        NetApi.loginByFace(mutableListOf(FileStreamReqParam("file", BitmapUtil.bitmapToByteArray(bitmap), ".bmp"))) {
+            if (it) {
+                NetApi.getUserInfo { userInfo ->
+                    NetApi.getCardInfoByLoginUser { itInfo ->
+                        Executor.runOnMain {
+                            itInfo?.let { info ->
+                                SPUtils.setLoginUser(mContext!!, info)
+                            }
+                            callBack.invoke(it, itInfo, userInfo)
+                        }
+                    }
+                }
+            } else {
+                Executor.runOnMain {
+                    callBack.invoke(false, null, null)
+                }
+            }
+        }
+    }
+
     fun registerListener() {
         BusinessManager.registerStatusListener(this) { dockBean ->
             dockBean.deviceList.forEach { deviceBean ->

+ 11 - 0
app/src/main/res/layout/dialog_login.xml

@@ -28,6 +28,17 @@
             android:textSize="@dimen/common_text_size_big" />
     </LinearLayout>
 
+    <FrameLayout
+        android:layout_width="165dp"
+        android:layout_height="146dp">
+
+        <androidx.camera.view.PreviewView
+            android:id="@+id/preview"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="invisible" />
+    </FrameLayout>
+
     <LinearLayout
         android:id="@+id/ll_account_container"
         android:layout_width="165dp"