diff --git a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt index cf2eeb1..436c8be 100644 --- a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt +++ b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt @@ -1,3 +1,5 @@ +@file:Suppress("DEPRECATION") + package com.sw.platecabinet.activity import android.Manifest @@ -10,10 +12,8 @@ import android.util.DisplayMetrics import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver -import android.widget.ImageView import androidx.annotation.RequiresApi import androidx.core.view.isVisible -import androidx.lifecycle.Observer import androidx.lifecycle.lifecycleScope import com.arcsoft.face.ErrorInfo import com.bumptech.glide.Glide @@ -58,12 +58,13 @@ import com.sw.platecabinet.utils.PlateUtils import com.sw.platecabinet.utils.RegisterCallbackHandler import com.sw.platecabinet.utils.SoundPoolUtil import com.sw.platecabinet.utils.SpTool +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import timber.log.Timber import java.io.File -import java.util.Arrays import java.util.concurrent.atomic.AtomicBoolean /** @@ -89,22 +90,13 @@ class LoginByFaceActivity : BaseActivity(), companion object { private const val TAG = "LoginByFaceActivity" - private var instance: LoginByFaceActivity? = null private const val COLLECT_SUCCESS = "collect_success" private const val RECOGNIZE_SUCCESS = "recognize_success" - private const val NO_PLATE_REMIND = "no_plate_remind"; - - fun goInitActivity() { - instance?.goInitActivity() - } + private const val NO_PLATE_REMIND = "no_plate_remind" } -// private var logList: MutableList = mutableListOf() -// private val logAdapter by lazy { LogAdapter(logList) } - override fun initialize() { - instance = this userViewModel.activeEngine() initArcViewModel() @@ -174,7 +166,7 @@ class LoginByFaceActivity : BaseActivity(), private var rgbFaceRectTransformer: FaceRectTransformer? = null private val livenessType = LivenessType.RGB private var openRectInfoDraw = false - private val regDebouncer = Debouncer(3000) + private val leftDebouncer = Debouncer(30*1000) private var registerHandler: RegisterCallbackHandler? = null @@ -213,7 +205,7 @@ class LoginByFaceActivity : BaseActivity(), } } } - recognizeViewModel.ftInitCode.observe(this, Observer { ftInitCode: Int? -> + recognizeViewModel.ftInitCode.observe(this) { ftInitCode: Int? -> if (ftInitCode != ErrorInfo.MOK) { val error: String? = getString( R.string.specific_engine_init_failed, "ftEngine", @@ -222,8 +214,8 @@ class LoginByFaceActivity : BaseActivity(), Timber.e("ftInitCode observe = $error") ToastUtils.showToast(error) } - }) - recognizeViewModel.frInitCode.observe(this, Observer { frInitCode: Int? -> + } + recognizeViewModel.frInitCode.observe(this) { frInitCode: Int? -> if (frInitCode != ErrorInfo.MOK) { val error: String? = getString( R.string.specific_engine_init_failed, "frEngine", @@ -232,8 +224,8 @@ class LoginByFaceActivity : BaseActivity(), Timber.e("frInitCode observe = $error") ToastUtils.showToast(error) } - }) - recognizeViewModel.flInitCode.observe(this, Observer { flInitCode: Int? -> + } + recognizeViewModel.flInitCode.observe(this) { flInitCode: Int? -> if (flInitCode != ErrorInfo.MOK) { val error: String? = getString( R.string.specific_engine_init_failed, "flEngine", @@ -242,31 +234,26 @@ class LoginByFaceActivity : BaseActivity(), Timber.e("flInitCode observe = $error") ToastUtils.showToast(error) } - }) + } recognizeViewModel.recognizeConfiguration - .observe(this, Observer { recognizeConfiguration: RecognizeConfiguration? -> + .observe(this) { recognizeConfiguration: RecognizeConfiguration? -> Timber.i("recognizeConfiguration: observe = ${recognizeConfiguration.toString()}") - }) - recognizeViewModel.recognizeNotice.observe(this, Observer { notice: String? -> + } + recognizeViewModel.recognizeNotice.observe(this) { notice: String? -> Timber.i("recognizeNotice observe notice = $notice") - }) + } - recognizeViewModel.recognizeUserId.observe(this, Observer { result: CompareResult? -> + recognizeViewModel.recognizeUserId.observe(this) { result: CompareResult? -> loadLogInfo("collectFace,recognizeUserId observe userId = ${result?.faceEntity?.userName}") loadFaceRecognizeResult3(result) - }) + } - recognizeViewModel.drawRectInfoText.observe(this, Observer { info -> + recognizeViewModel.drawRectInfoText.observe(this) { info -> Timber.i("drawRectInfoText observe info = $info") - }) + } } - /** - * 人脸识别开关,true-loadFaceRecognizeResult2,false-loadFaceRecognizeResult - */ - private var faceUseSwitch = true - /** * 识别失败重试次数 */ @@ -277,11 +264,6 @@ class LoginByFaceActivity : BaseActivity(), */ private val maxFailCount = 5 - /** - * 人脸失败阈值 - */ - private val faceFailThreshold = 0.3 - /** * 配置阈值,默认值为0.8 */ @@ -295,8 +277,7 @@ class LoginByFaceActivity : BaseActivity(), binding.tvSimilarValue.text = "$similar,${retryFailCount}次" loadLogInfo( - "collectFace,recognizeUserId 阈值 success=$faceSuccessThreshold, " + - "fail=$faceFailThreshold, similar=$similar, retry=$retryFailCount" + "collectFace,recognizeUserId 阈值 success=$faceSuccessThreshold, similar=$similar, retry=$retryFailCount" ) if (similar >= faceSuccessThreshold) { val userId = result.faceEntity?.userName @@ -309,7 +290,6 @@ class LoginByFaceActivity : BaseActivity(), return } -// if (similar <= faceFailThreshold || retryFailCount >= maxFailCount) { if (retryFailCount >= maxFailCount) { loadLogInfo( "collectFace,recognizeUserId 识别失败,开始采集 similar=$similar, " + @@ -404,7 +384,7 @@ class LoginByFaceActivity : BaseActivity(), item.updateTime = DateTimeUtils.getDateTimeString() item.plateNumber = null plateEnable = false - Debouncer(5000).debounce { + openDebouncer.debounce { //打开柜子 PlateUtils.open(this, item.equipmentBoxCode, false) { goInitActivity() @@ -416,20 +396,19 @@ class LoginByFaceActivity : BaseActivity(), SpTool.savePlateData(items) } } - -// private val debouncer by lazy { Debouncer(3000) } + private val openDebouncer by lazy { Debouncer(5000) } private fun initArcView() { //在布局结束后才做初始化操作 - binding.dualCameraTexturePreviewRgb.getViewTreeObserver().addOnGlobalLayoutListener(this) - recognizeViewModel.getCompareResultList().getValue() + binding.dualCameraTexturePreviewRgb.viewTreeObserver.addOnGlobalLayoutListener(this) + val list = recognizeViewModel.getCompareResultList().getValue() + loadLogInfo("initArcView:list.size=${list?.size}") } override fun onDestroy() { loadLogInfo("onDestroy") - instance = null if (rgbCameraHelper != null) { - rgbCameraHelper!!.release() + rgbCameraHelper?.release() rgbCameraHelper = null } @@ -474,7 +453,7 @@ class LoginByFaceActivity : BaseActivity(), layoutParams.width = (measuredHeight * ratio).toInt() } if (scale < 1f) { - val rgbParam = rgbPreview.getLayoutParams() + val rgbParam = rgbPreview.layoutParams layoutParams.width = (rgbParam.width * scale).toInt() layoutParams.height = (rgbParam.height * scale).toInt() } else { @@ -510,8 +489,8 @@ class LoginByFaceActivity : BaseActivity(), isMirror: Boolean ) { loadLogInfo("initRgbCamera Rgb onCameraOpened: cameraId = $cameraId, displayOrientation = $displayOrientation") - runOnUiThread({ - val previewSizeRgb = camera.getParameters().getPreviewSize() + runOnUiThread { + val previewSizeRgb = camera.parameters.previewSize val layoutParams = adjustPreviewViewSize( binding.dualCameraTexturePreviewRgb, binding.dualCameraTexturePreviewRgb, binding.dualCameraFaceRectView, @@ -545,7 +524,7 @@ class LoginByFaceActivity : BaseActivity(), recognizeViewModel.onRgbCameraOpened(camera) recognizeViewModel.setRgbFaceRectTransformer(rgbFaceRectTransformer) - }) + } } @RequiresApi(api = Build.VERSION_CODES.Q) @@ -607,8 +586,8 @@ class LoginByFaceActivity : BaseActivity(), .previewOn(binding.dualCameraTexturePreviewRgb) .cameraListener(cameraListener) .build() - rgbCameraHelper!!.init() - rgbCameraHelper!!.start() + rgbCameraHelper?.init() + rgbCameraHelper?.start() } /** @@ -634,7 +613,7 @@ class LoginByFaceActivity : BaseActivity(), override fun onGlobalLayout() { loadLogInfo("onGlobalLayout") - binding.dualCameraTexturePreviewRgb.getViewTreeObserver().removeOnGlobalLayoutListener(this) + binding.dualCameraTexturePreviewRgb.viewTreeObserver.removeOnGlobalLayoutListener(this) // 请求权限 checkCameraPermission() } @@ -644,7 +623,7 @@ class LoginByFaceActivity : BaseActivity(), if (rgbCameraHelper != null && rgbCameraHelper!!.isStopped) { loadLogInfo("collectFace,resumeCamera: ") isRecognition = true - rgbCameraHelper!!.start() + rgbCameraHelper?.start() } else { //recognizeViewModel.onPreviewFrame(ByteArray(1382400), true) @@ -669,9 +648,11 @@ class LoginByFaceActivity : BaseActivity(), // Y 分量(亮度)设为 0(全黑),UV 分量设为 128(默认值) // 1. 填充 Y 分量(前 frameSize 个字节) - Arrays.fill(nv21Data, 0, frameSize, 0.toByte()) +// Arrays.fill(nv21Data, 0, frameSize, 0.toByte()) + nv21Data.fill(0, 0, frameSize) // 2. 填充 UV 分量(后 frameSize/2 个字节) - Arrays.fill(nv21Data, frameSize, nv21Data.size, 128.toByte()) +// Arrays.fill(nv21Data, frameSize, nv21Data.size, 128.toByte()) + nv21Data.fill(128.toByte(), frameSize, nv21Data.size) return nv21Data } @@ -680,10 +661,10 @@ class LoginByFaceActivity : BaseActivity(), val emptyFrame = createBlackNV21Frame(1920, 1080) // 传递“空帧” recognizeViewModel.onPreviewFrame(emptyFrame, true) - /** - * 临时用户id - */ - private var tempUserId: String = "" +// /** +// * 临时用户id +// */ +// private var tempUserId: String = "" override fun onResume() { super.onResume() try { @@ -714,7 +695,7 @@ class LoginByFaceActivity : BaseActivity(), isCollectFace = false plateEnable = true collectCount = 0 - tempUserId = "${System.currentTimeMillis()}" +// tempUserId = "${System.currentTimeMillis()}" resumeCamera() registerHandler = RegisterCallbackHandler() @@ -741,7 +722,7 @@ class LoginByFaceActivity : BaseActivity(), private var isFirstOpen = true - protected override fun onPause() { + override fun onPause() { pauseCamera() super.onPause() CountDownManager.cancelCountDown() @@ -752,11 +733,6 @@ class LoginByFaceActivity : BaseActivity(), // recognizeViewModel.onPreviewFrame(emptyFrame, true) } - override fun handleLoginSuccess(equipmentUserInfo: EquipmentUserInfo, isAdmin: Boolean) { - super.handleLoginSuccess(equipmentUserInfo, isAdmin) -// goInitActivity() - } - private fun judgeRecognizeState(): Boolean { val rectColor = binding.dualCameraFaceRectView.rectColor if (rectColor == RecognizeColor.COLOR_SUCCESS && currentUserId.isNullOrBlank().not() && facePreviewInfoList.isNullOrEmpty().not()) { @@ -823,7 +799,7 @@ class LoginByFaceActivity : BaseActivity(), loadLogInfo("collectFace,sendFaceData: ----------12,发送人脸数据成功但接口返回为null,faceData=${faceData}") return@addUserFace } - Thread { + lifecycleScope.launch(Dispatchers.IO) { saveFaceInfo(faceModel) { runOnUiThread { Glide.with(this@LoginByFaceActivity).load(imageFile).into(binding.ivCollectPhoto) @@ -866,7 +842,7 @@ class LoginByFaceActivity : BaseActivity(), private var currentUserId: String? = null - private fun saveFaceInfo(faceModel: UserFaceModel, block:()-> Unit= {}) { + private fun saveFaceInfo(faceModel: UserFaceModel, block: () -> Unit = {}) { try { loadLogInfo("collectFace,saveFaceInfo: ----------8,保存人脸取特征数据-----------") val faceDao = FaceDatabase.getInstance(this).faceDao()