From 385ada4a0d13ac8a8ca5826482d947db5de1daf9 Mon Sep 17 00:00:00 2001 From: mazengfei <331023091@qq.com> Date: Wed, 8 Apr 2026 15:57:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(face):=20=E4=BF=AE=E5=A4=8D=E7=9F=AD?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=86=85=E5=86=8D=E6=AC=A1=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=A7=A6=E5=8F=91=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 RecognizeViewModel.resetFaceState(),在 resetRecognizeState() 时 同时清空粘性 LiveData 和 FaceHelper 内部 recognizeInfoMap, 防止旧 trackId 状态残留导致识别流程无法重新触发。 Co-Authored-By: Claude Sonnet 4.6 --- .../platecabinet/activity/LoginByFaceActivity.kt | 2 ++ .../java/com/sw/platecabinet/utils/Debouncer.kt | 9 ++++++++- .../arcface/viewmodel/RecognizeViewModel.java | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) 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 fb2bbd7..8cc67e5 100644 --- a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt +++ b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt @@ -768,6 +768,8 @@ class LoginByFaceActivity : BaseActivity(), collectCount = 0 // tempUserId = "${System.currentTimeMillis()}" openPlateDebouncer.reset() + // 清空上次识别结果和 FaceHelper 内部状态,防止短时间内再次识别无法触发 + recognizeViewModel.resetFaceState() resumeCamera() registerHandler = RegisterCallbackHandler() diff --git a/app/src/main/java/com/sw/platecabinet/utils/Debouncer.kt b/app/src/main/java/com/sw/platecabinet/utils/Debouncer.kt index 3c36921..c86c4d0 100644 --- a/app/src/main/java/com/sw/platecabinet/utils/Debouncer.kt +++ b/app/src/main/java/com/sw/platecabinet/utils/Debouncer.kt @@ -1,6 +1,11 @@ package com.sw.platecabinet.utils +import timber.log.Timber + class Debouncer(private val delayMillis: Long) { + companion object { + const val TAG = "Debouncer" + } private var lastActionTime = 0L /** @@ -8,13 +13,15 @@ class Debouncer(private val delayMillis: Long) { * @param action 要执行的操作 * @return Boolean 是否执行了操作 (true=已执行, false=被防抖) */ - fun debounce(action: () -> Unit): Boolean { + fun debounce(tag:String = TAG, action: () -> Unit): Boolean { val currentTime = System.currentTimeMillis() if (currentTime - lastActionTime >= delayMillis) { + Timber.tag(tag).d("collectFace,recognizeUserId防止重复操作:执行action回调") lastActionTime = currentTime action() return true } + Timber.tag(tag).d("collectFace,recognizeUserId防止重复操作-----------------------") return false } diff --git a/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java b/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java index 5e0c7c9..0c82b36 100644 --- a/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java +++ b/lib_face/src/main/java/com/sw/plate/utils/arcface/viewmodel/RecognizeViewModel.java @@ -397,6 +397,20 @@ public class RecognizeViewModel extends ViewModel implements RecognizeCallback { } } + /** + * 重置人脸识别状态:清空上次识别结果及 FaceHelper 内部的 recognizeInfoMap, + * 使下一帧进入时能重新触发识别流程。 + * 适用场景:短时间内再次识别、点击重试按钮等需要重新开始识别的时机。 + */ + public void resetFaceState() { + // 清空粘性 LiveData,防止旧结果被重新投递给 observer + recognizeUserId.postValue(null); + // 清空 FaceHelper 内部所有人脸状态,让 trackId 对应的状态回到 TO_RETRY + if (faceHelper != null) { + faceHelper.clearFacePreviewInfoList(); + } + } + /** * 释放操作 */