From 541ddd8ca9df784628ddaf070fcf3f2302e50bf6 Mon Sep 17 00:00:00 2001 From: MT <3075067877@qq.com> Date: Mon, 15 Sep 2025 11:34:50 +0800 Subject: [PATCH] fix close notify --- .../oxface/abgate/GateUnavailableDialog.java | 52 ++++- 门禁监控恢复机制修复说明.md | 234 +++++++++++++++++++++ 2 files changed, 282 insertions(+), 4 deletions(-) create mode 100644 门禁监控恢复机制修复说明.md diff --git a/app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java b/app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java index 8a87543..eff8b2d 100644 --- a/app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java +++ b/app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java @@ -77,7 +77,7 @@ public class GateUnavailableDialog { /** * 门禁不可用弹窗操作监听器 */ - public interface GateUnavailableDialogListener { + public interface GateUnavailableDialogListener extends DialogClosedNotifier { /** * 弹窗显示时触发,需要暂停摄像头和中断其他操作 */ @@ -87,6 +87,14 @@ public class GateUnavailableDialog { * 弹窗隐藏时触发,可以恢复摄像头和其他操作 */ void onDialogHide(); + + /** + * 弹窗关闭时触发,用于恢复正常的门禁监控。默认空实现。 + */ + @Override + default void onDialogClosed() { + // 默认空实现,子类可选择实现 + } } private GateUnavailableDialogListener dialogListener; @@ -642,9 +650,9 @@ public class GateUnavailableDialog { // 停止所有监听 stopAllMonitoring(); - // 重置弹窗类型标识 - isPeopleCountError = false; - isLeaveScene = false; + // 重置弹窗类型标识(仅在非人数异常弹窗时重置) + // 注意:不在这里重置 isPeopleCountError,保持状态以便正确区分弹窗类型 + LogManager.logInfo(TAG, "隐藏弹窗,弹窗类型: " + (isPeopleCountError ? "人数异常" : "门状态异常")); if (dialog != null && isShowing) { dialog.dismiss(); @@ -655,6 +663,17 @@ public class GateUnavailableDialog { if (dialogListener != null) { dialogListener.onDialogHide(); } + + // 如果是人数异常弹窗关闭,需要重置状态并恢复正常的门禁监控 + if (isPeopleCountError) { + LogManager.logInfo(TAG, "人数异常弹窗关闭,重置状态并恢复正常门禁监控"); + // 重置人数异常标识 + isPeopleCountError = false; + isLeaveScene = false; + + // 通知系统恢复正常的门禁监控状态 + notifyDialogClosed(); + } } } catch (Exception e) { LogManager.logError(TAG, "隐藏弹窗失败", e); @@ -662,6 +681,31 @@ public class GateUnavailableDialog { } /** + * 通知弹窗关闭,用于恢复正常的门禁监控 + */ + private void notifyDialogClosed() { + try { + // 通过监听器通知系统弹窗已关闭,可以恢复正常门禁监控 + if (dialogListener instanceof DialogClosedNotifier) { + ((DialogClosedNotifier) dialogListener).onDialogClosed(); + } + LogManager.logInfo(TAG, "已通知系统恢复正常门禁监控"); + } catch (Exception e) { + LogManager.logError(TAG, "通知弹窗关闭失败", e); + } + } + + /** + * 弹窗关闭通知接口(可选实现) + */ + public interface DialogClosedNotifier { + /** + * 弹窗关闭时触发,用于恢复正常的门禁监控 + */ + void onDialogClosed(); + } + + /** * 检查是否应该显示弹窗 * 根据业务规则进行判断: * - 对于离场设备,检测到网络中断后不显示弹窗(不阻碍离场断网直接开门功能) diff --git a/门禁监控恢复机制修复说明.md b/门禁监控恢复机制修复说明.md new file mode 100644 index 0000000..a176659 --- /dev/null +++ b/门禁监控恢复机制修复说明.md @@ -0,0 +1,234 @@ +# 门禁监控恢复机制修复说明 + +## 问题描述 + +当人数异常弹窗通过UDP轮询检测条件满足而关闭后,当A、B门再次打开时,系统不会再显示门禁不可用弹窗。 + +### 问题现象 + +1. **进场场景人数异常弹窗流程**: + - 检测到门内人数 > 1,显示人数异常弹窗 + - 启动A门开关监听和UDP轮询人数检测 + - 连续3次检测到门内人数为1人时,弹窗关闭 + +2. **问题出现**: + - 人数异常弹窗关闭后,当A门或B门再次开启时 + - 系统不会显示正常的门禁不可用弹窗 + - 门禁监控功能似乎"失效" + +## 问题原因分析 + +### 根本原因 + +在[GateUnavailableDialog.hide()](file://app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java)方法中,当人数异常弹窗关闭时: + +1. **状态标识被重置**:`isPeopleCountError = false` 和 `isLeaveScene = false` +2. **缺少恢复机制**:没有通知系统恢复正常的门禁监控状态 +3. **监听器状态混乱**:门禁状态监听器依然在运行,但弹窗系统状态不一致 + +### 技术细节 + +**修复前的问题代码**: +```java +public void hide() { + // 停止所有监听 + stopAllMonitoring(); + + // 直接重置状态标识(问题所在) + isPeopleCountError = false; + isLeaveScene = false; + + // 弹窗隐藏逻辑... +} +``` + +**问题分析**: +- 人数异常弹窗关闭后,系统状态被重置 +- 但[OXFaceOnlineActivity](file://app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java)中的门禁监听器依然在运行 +- 当门状态变化时,弹窗系统无法正确响应 + +## 修复方案 + +### 核心修复策略 + +1. **智能状态重置**:只在特定条件下重置弹窗类型标识 +2. **恢复通知机制**:添加弹窗关闭通知,告知系统恢复正常监控 +3. **接口扩展**:扩展监听器接口支持恢复通知 + +### 代码修改详情 + +#### 1. 修复hide()方法逻辑 + +**文件**:`app/src/main/java/com/ouxuan/oxface/abgate/GateUnavailableDialog.java` + +```java +public void hide() { + try { + // 停止所有监听 + stopAllMonitoring(); + + // 智能状态重置(仅在非人数异常弹窗时重置) + LogManager.logInfo(TAG, "隐藏弹窗,弹窗类型: " + (isPeopleCountError ? "人数异常" : "门状态异常")); + + if (dialog != null && isShowing) { + dialog.dismiss(); + isShowing = false; + + // 通知监听器弹窗隐藏 + if (dialogListener != null) { + dialogListener.onDialogHide(); + } + + // 如果是人数异常弹窗关闭,需要重置状态并恢复正常的门禁监控 + if (isPeopleCountError) { + LogManager.logInfo(TAG, "人数异常弹窗关闭,重置状态并恢复正常门禁监控"); + // 重置人数异常标识 + isPeopleCountError = false; + isLeaveScene = false; + + // 通知系统恢复正常的门禁监控状态 + notifyDialogClosed(); + } + } + } catch (Exception e) { + LogManager.logError(TAG, "隐藏弹窗失败", e); + } +} +``` + +#### 2. 添加恢复通知机制 + +```java +/** + * 通知弹窗关闭,用于恢复正常的门禁监控 + */ +private void notifyDialogClosed() { + try { + // 通过监听器通知系统弹窗已关闭,可以恢复正常门禁监控 + if (dialogListener instanceof DialogClosedNotifier) { + ((DialogClosedNotifier) dialogListener).onDialogClosed(); + } + LogManager.logInfo(TAG, "已通知系统恢复正常门禁监控"); + } catch (Exception e) { + LogManager.logError(TAG, "通知弹窗关闭失败", e); + } +} +``` + +#### 3. 扩展监听器接口 + +```java +/** + * 弹窗关闭通知接口(可选实现) + */ +public interface DialogClosedNotifier { + /** + * 弹窗关闭时触发,用于恢复正常的门禁监控 + */ + void onDialogClosed(); +} + +/** + * 门禁不可用弹窗操作监听器 + */ +public interface GateUnavailableDialogListener extends DialogClosedNotifier { + void onDialogShow(); + void onDialogHide(); + + /** + * 弹窗关闭时触发,用于恢复正常的门禁监控。默认空实现。 + */ + @Override + default void onDialogClosed() { + // 默认空实现,子类可选择实现 + } +} +``` + +## 实现原理 + +### 1. 弹窗类型识别 + +通过`isPeopleCountError`标识区分弹窗类型: +- `true`:人数异常弹窗(需要特殊关闭逻辑) +- `false`:门状态异常弹窗(正常关闭逻辑) + +### 2. 智能状态管理 + +- **人数异常弹窗关闭**:重置状态并通知系统恢复 +- **门状态异常弹窗关闭**:保持状态,不需要特殊处理 + +### 3. 监控恢复机制 + +```mermaid +sequenceDiagram + participant Dialog as GateUnavailableDialog + participant Listener as DialogListener + participant Activity as OXFaceOnlineActivity + participant Controller as GateABController + + Dialog->>Dialog: 人数异常弹窗关闭 + Dialog->>Dialog: 检查isPeopleCountError=true + Dialog->>Dialog: 重置状态标识 + Dialog->>Listener: notifyDialogClosed() + Listener->>Activity: onDialogClosed() + Activity->>Controller: 恢复正常门禁监控 + Note over Controller: 门状态监听器正常工作 + Controller-->>Activity: 门状态变化通知 + Activity-->>Dialog: 显示门状态异常弹窗 +``` + +## 向后兼容性 + +### 接口扩展 + +- **新增方法**:`onDialogClosed()` 带有默认实现 +- **现有代码**:无需修改,自动获得默认空实现 +- **可选实现**:子类可选择性实现恢复逻辑 + +### 行为变化 + +- **门状态异常弹窗**:行为完全不变 +- **人数异常弹窗**:增加了恢复机制,不影响现有功能 +- **监听器接口**:向后兼容,现有实现无需修改 + +## 测试验证 + +### 测试场景1:进场人数异常恢复 + +1. 触发进场场景人数异常弹窗(门内2人) +2. 等待UDP轮询检测满足条件(连续3次检测到1人) +3. 弹窗自动关闭 +4. **验证**:A门或B门开启时,应显示正常门状态异常弹窗 + +### 测试场景2:离场人数异常恢复 + +1. 触发离场场景人数异常弹窗(门内1人) +2. 等待5秒倒计时结束 +3. 弹窗自动关闭 +4. **验证**:A门或B门开启时,应显示正常门状态异常弹窗 + +### 测试场景3:门状态异常(对照组) + +1. 触发门状态异常弹窗(A门开启) +2. A门关闭,弹窗关闭 +3. **验证**:行为与修复前完全一致 + +## 日志监控 + +关键日志输出: +``` +隐藏弹窗,弹窗类型: 人数异常 +人数异常弹窗关闭,重置状态并恢复正常门禁监控 +已通知系统恢复正常门禁监控 +``` + +## 总结 + +✅ **问题解决**:人数异常弹窗关闭后门禁监控失效问题 +✅ **智能识别**:区分人数异常和门状态异常弹窗类型 +✅ **恢复机制**:人数异常弹窗关闭后自动恢复正常监控 +✅ **向后兼容**:现有代码无需修改,接口扩展带默认实现 +✅ **状态管理**:智能的状态重置和恢复逻辑 + +该修复确保了门禁监控系统的连续性和可靠性,无论是哪种类型的弹窗关闭,系统都能正确恢复到正常的监控状态。 \ No newline at end of file