From e5940605c12a72be28e5017d3bb5a4ec09b5dd3a Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Thu, 5 Feb 2026 08:39:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sw/face/collect/MainActivity.kt | 106 ++++++++++-------- .../collect/utils/RegisterCallbackHandler.kt | 15 +++ app/src/main/res/layout/activity_main.xml | 35 +++--- 3 files changed, 90 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/com/sw/face/collect/utils/RegisterCallbackHandler.kt diff --git a/app/src/main/java/com/sw/face/collect/MainActivity.kt b/app/src/main/java/com/sw/face/collect/MainActivity.kt index 916b3da..9c9f8c5 100644 --- a/app/src/main/java/com/sw/face/collect/MainActivity.kt +++ b/app/src/main/java/com/sw/face/collect/MainActivity.kt @@ -12,6 +12,7 @@ import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver import android.widget.FrameLayout +import android.widget.Toast import androidx.activity.viewModels import androidx.core.content.ContextCompat import androidx.lifecycle.Observer @@ -31,6 +32,7 @@ import com.sw.face.collect.utils.BitmapUtils import com.sw.face.collect.utils.Debouncer import com.sw.face.collect.utils.FaceEngineUtils import com.sw.face.collect.utils.IntervalExecutor +import com.sw.face.collect.utils.RegisterCallbackHandler import com.sw.face.collect.utils.SoundPoolUtil import com.sw.face.collect.viewmodel.MainViewModel import com.sw.inbound.utils.DateTimeUtils @@ -110,14 +112,15 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo //mainViewModel.getUserFaceCache(pageNo = pageNo) FaceEngineUtils.activeEngine() -// binding.btnCollectFace.setOnClickListener { + binding.btnCollectFace.setOnClickListener { + registerHandler = RegisterCallbackHandler() // requestSinglePermissionResult(Manifest.permission.CAMERA) { granted -> // if (granted.not()) { // toast("没有相机权限") // return@requestSinglePermissionResult // } // } -// } + } binding.tvTitle.setOnClickListener { finish() } //addSocketListener() @@ -327,6 +330,7 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo private var isCheckCamera = false private var isCollectFace = false private val isCollecting = AtomicBoolean(false) + private var registerHandler: RegisterCallbackHandler? = null private fun initArcViewModel() { if (DualCameraHelper.hasDualCamera()) { livenessType = LivenessType.IR @@ -340,20 +344,22 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo recognizeViewModel.prepareRegister() recognizeViewModel.setOnRegisterFinishedCallback { facePreviewInfo, userFaceInfo -> Log.d(TAG, "initArcViewModel: userFaceInfo == null : ${userFaceInfo == null}") - if (!isCollectFace) { - return@setOnRegisterFinishedCallback - } - if (this.userFaceInfo == null && userFaceInfo != null) { - loadLogInfo("collectFace:开始采集------------") - recognizeViewModel.updateRegisterStatus(RecognizeViewModel.REGISTER_STATUS_DONE) - this.userFaceInfo = userFaceInfo - getFaceDataBlock { faceData, headBmp -> - isCollecting.set(false) - isCollectFace = false - loadLogInfo("collectFace:采集完成,准备上传------------") - sendFaceData(faceData, headBmp) + registerHandler?.setCallback { + if (!isCollectFace) { + return@setCallback + } + if (this.userFaceInfo == null && userFaceInfo != null) { + Toast.makeText(this@MainActivity, "开始采集", Toast.LENGTH_SHORT).show() + loadLogInfo("collectFace:开始采集------------") + recognizeViewModel.updateRegisterStatus(RecognizeViewModel.REGISTER_STATUS_DONE) + this.userFaceInfo = userFaceInfo + getFaceDataBlock { faceData, headBmp -> + isCollecting.set(false) + isCollectFace = false + loadLogInfo("collectFace:采集完成,准备上传------------") + sendFaceData(faceData, headBmp) + } } - return@setOnRegisterFinishedCallback } } recognizeViewModel.ftInitCode.observe(this, Observer { ftInitCode: Int? -> @@ -473,7 +479,7 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo // // 防抖,防止重复开闸 Debouncer(5000).debounce { - countDownTimer?.cancel() +// countDownTimer?.cancel() binding.tvCountDown.text = "" SoundPoolUtil.getInstance().play(RECOGNIZE_SUCCESS, 0) //openPlate(userId) @@ -655,6 +661,7 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo } if (facePreviewInfoList.isNullOrEmpty()) { binding.tvSimilarValue.text = "" + registerHandler = RegisterCallbackHandler() } recognizeViewModel.clearLeftFace(facePreviewInfoList) } @@ -975,12 +982,12 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo override fun onResume() { super.onResume() setupArcCamera() - + registerHandler = RegisterCallbackHandler() resumeCamera() } override fun onPause() { - countDownTimer?.cancel() +// countDownTimer?.cancel() super.onPause() pauseCamera() } @@ -1013,7 +1020,8 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo loadLogInfo("collectFace:数据为空------11111------") return } - val faceData: String? = com.sw.plate.utils.Base64.encode(userFaceInfo?.faceFeature?.featureData) + val faceData: String? = + com.sw.plate.utils.Base64.encode(userFaceInfo?.faceFeature?.featureData) if (faceData.isNullOrBlank()) { loadLogInfo("collectFace:数据为空------22222------") return @@ -1035,41 +1043,41 @@ class MainActivity : BaseActivity(), ViewTreeObserver.OnGlo private val total = 30 private var countDownJob: Job? = null private fun countDown() { -// countDownJob = countDownByFlow( -// total = total, -// scope = lifecycleScope, -// onStart = { -// binding.tvCountDown.text = "${total}s" -// }, -// onTick = { seconds -> -// binding.tvCountDown.text = "${seconds}s" -// }, -// onFinish = { -// } -// ) - if (countDownTimer == null) { - initCountTime() - } - countDownDebounce.debounce { - countDownTimer?.start() - } +//// countDownJob = countDownByFlow( +//// total = total, +//// scope = lifecycleScope, +//// onStart = { +//// binding.tvCountDown.text = "${total}s" +//// }, +//// onTick = { seconds -> +//// binding.tvCountDown.text = "${seconds}s" +//// }, +//// onFinish = { +//// } +//// ) +// if (countDownTimer == null) { +// initCountTime() +// } +// countDownDebounce.debounce { +// countDownTimer?.start() +// } } private val countDownDebounce = Debouncer(10000) - private var countDownTimer:CountDownTimer?=null - - private val totalTimeInMillis = 30 * 1000L + // private var countDownTimer:CountDownTimer?=null +// +// private val totalTimeInMillis = 30 * 1000L fun initCountTime() { - countDownTimer = object : CountDownTimer(totalTimeInMillis, 1000) { - override fun onTick(millisUntilFinished: Long) { - loadLogInfo("initCountTime onTick = ${(millisUntilFinished / 1000).toInt()}") - binding.tvCountDown.text = "${(millisUntilFinished / 1000).toInt() + 1}s" - } - - override fun onFinish() { - } - } + //countDownTimer = object : CountDownTimer(totalTimeInMillis, 1000) { + // override fun onTick(millisUntilFinished: Long) { + // loadLogInfo("initCountTime onTick = ${(millisUntilFinished / 1000).toInt()}") + // binding.tvCountDown.text = "${(millisUntilFinished / 1000).toInt() + 1}s" + // } +// + // override fun onFinish() { + // } + //} } } \ No newline at end of file diff --git a/app/src/main/java/com/sw/face/collect/utils/RegisterCallbackHandler.kt b/app/src/main/java/com/sw/face/collect/utils/RegisterCallbackHandler.kt new file mode 100644 index 0000000..21ac6b0 --- /dev/null +++ b/app/src/main/java/com/sw/face/collect/utils/RegisterCallbackHandler.kt @@ -0,0 +1,15 @@ +package com.sw.face.collect.utils + +class RegisterCallbackHandler { + private var isCallbackCalled = false + private val lock = Any() + + fun setCallback(callback: () -> Unit) { + synchronized(lock) { + if (!isCallbackCalled) { + isCallbackCalled = true + callback() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2b7cfa9..e314886 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -135,25 +135,26 @@ android:textSize="26sp" /> - - - - - - + - - - - - - - - - - + - +