# 解锁密码弹窗功能实现说明 ## 功能概述 本次实现了解锁密码弹窗功能,为特殊情况下退出人脸识别界面提供了一个安全的出口。该功能完全符合用户需求,提供了美观简洁的界面和安全的密码验证机制。 ## 实现的功能 ### 1. 解锁密码弹窗类 (`UnlockPasswordDialog.java`) **位置**: `app/src/main/java/com/ouxuan/oxface/device/UnlockPasswordDialog.java` **主要特性**: - 美观的弹窗界面设计,符合主题色 - 安全的密码输入(显示为密码形式) - 实时密码验证(与本地存储的登录密码对比) - 错误提示功能(密码错误时显示红色提示) - 摄像头控制集成(弹窗显示时暂停摄像头,关闭时恢复) - 软键盘自动弹出和收起 - 完整的生命周期管理 **核心方法**: - `show()`: 显示弹窗 - `dismiss()`: 关闭弹窗 - `handleConfirm()`: 处理密码验证 - `UnlockDialogListener`: 回调接口 ### 2. 触发机制 #### 2.1 店铺名称连续点击触发 **位置**: `OXFaceOnlineActivity.java` 中的 `handleStoreNameClick()` 方法 **触发条件**: 连续6次点击视频流界面左上角的店铺名称按钮(`tv_store_name`) - 点击间隔限制:1秒内点击有效 - 点击计数:达到6次时触发 - 用户提示:3次点击后提示剩余次数 #### 2.2 门禁不可用弹窗标题点击触发 **位置**: `GateUnavailableDialog.java` 中的 `handleTitleClick()` 方法 **触发条件**: 连续6次点击门禁不可用弹窗的标题(`tvTitle`) - 点击间隔限制:1秒内点击有效 - 点击计数:达到6次时触发 - 日志记录:详细记录点击过程 ### 3. 密码验证机制 **验证逻辑**: 1. 获取用户输入的密码 2. 从 `LoginDataManager` 获取本地存储的登录密码 3. 进行字符串比较验证 4. 验证成功:调用 `unLockAndLeaveFaceDetect()` 方法 5. 验证失败:显示红色错误提示,清空输入框 **安全特性**: - 密码以密文形式显示 - 错误时提供明确的用户反馈 - 支持键盘回车确认 ### 4. 解锁退出功能 (`unLockAndLeaveFaceDetect()`) **执行流程**: 1. 停止摄像头预览 2. 创建返回登录界面的Intent 3. 设置Intent标志(清除任务栈) 4. 启动MainActivity(登录界面) 5. 结束当前人脸识别界面 6. 记录详细的操作日志 ### 5. 摄像头控制集成 **自动控制**: - 弹窗显示时:自动暂停摄像头预览 - 弹窗关闭时:自动恢复摄像头预览 - 解锁成功时:永久停止摄像头(准备退出) ## 界面设计特点 ### 1. 视觉设计 - **主题色配色**: 蓝色确认按钮 (#007AFF),灰色取消按钮 - **圆角设计**: 弹窗、按钮、输入框均采用圆角设计 - **半透明背景**: 黑色半透明背景 (#CC000000) - **响应式布局**: 根据屏幕密度自适应大小 ### 2. 交互设计 - **焦点管理**: 弹窗显示时自动聚焦到密码输入框 - **键盘控制**: 自动弹出软键盘,支持回车确认 - **错误反馈**: 密码错误时显示红色提示文字 - **防误操作**: 弹窗不可通过点击外部区域关闭 ### 3. 尺寸规格 - **弹窗宽度**: 320dp - **输入框宽度**: 280dp - **按钮尺寸**: 100dp × 45dp - **文字大小**: 标题20sp,正文16sp,提示14sp ## 技术实现细节 ### 1. 类结构设计 ```java // 主要类和接口 - UnlockPasswordDialog: 主弹窗类 - UnlockDialogListener: 回调接口 - UnlockPasswordDialogTrigger: 触发器接口 ``` ### 2. 生命周期管理 - 创建时初始化所有UI组件 - 显示时设置焦点和键盘 - 关闭时清理资源和隐藏键盘 - 销毁时释放所有引用 ### 3. 错误处理 - 完善的异常捕获和日志记录 - 用户友好的错误提示 - 安全的资源释放机制 ## 配置和依赖 ### 1. 依赖的现有组件 - `LoginDataManager`: 获取存储的登录密码 - `LogManager`: 日志记录 - `CameraPreviewManager`: 摄像头控制 ### 2. 权限要求 - 无需额外权限 - 使用现有的摄像头权限 ## 使用方法 ### 1. 普通用户使用 1. 在人脸识别界面,连续快速点击左上角店铺名称6次 2. 或者等待门禁不可用弹窗出现时,连续快速点击弹窗标题6次 3. 在弹出的解锁密码弹窗中输入登录密码 4. 点击确认或按回车键 5. 密码正确后自动返回登录界面 ### 2. 开发者调试 - 查看日志中的 "解锁" 相关信息 - 验证点击计数和密码验证逻辑 - 检查摄像头暂停/恢复状态 ## 安全性考虑 ### 1. 访问控制 - 隐蔽的触发方式(连续6次点击) - 密码验证机制 - 无明显的UI提示(防止误操作) ### 2. 密码安全 - 使用现有的登录密码验证 - 密文显示输入内容 - 错误时不显示具体的密码信息 ### 3. 日志安全 - 不记录用户输入的密码 - 只记录验证成功/失败的结果 - 详细记录操作流程便于调试 ## 测试建议 ### 1. 功能测试 - 测试两种触发方式 - 测试正确和错误密码的处理 - 测试摄像头暂停/恢复功能 - 测试解锁后的界面跳转 ### 2. 界面测试 - 不同屏幕尺寸的适配 - 横竖屏切换(如支持) - 软键盘弹出和收起 - 错误提示的显示和隐藏 ### 3. 异常测试 - 密码为空的处理 - 网络异常时的处理 - 内存不足时的处理 - 快速重复操作的处理 ## 维护说明 ### 1. 常见问题排查 - 检查 `LoginDataManager` 中是否有保存的密码 - 确认点击计数逻辑是否正确 - 验证摄像头控制广播是否正常 ### 2. 代码修改建议 - 若需修改触发次数,修改 `MAX_CLICK_COUNT` 和 `TITLE_MAX_CLICK_COUNT` 常量 - 若需修改UI样式,在 `createDialog()` 方法中调整 - 若需修改密码验证逻辑,在 `handleConfirm()` 方法中调整 ### 3. 日志查看 - 搜索 "解锁" 关键字查看相关日志 - 搜索 "点击" 关键字查看触发日志 - 搜索 "密码" 关键字查看验证日志(不包含实际密码) ## 总结 本实现完全满足了用户的需求: ✅ 两种隐蔽的触发方式(店铺名称和弹窗标题) ✅ 美观简洁的弹窗界面 ✅ 安全的密码验证机制 ✅ 完整的摄像头控制集成 ✅ 可靠的解锁退出功能 ✅ 符合主题色的界面设计 ✅ 完善的错误处理和日志记录 该功能为特殊情况下的程序退出提供了安全可靠的解决方案,既保证了系统的安全性,又提供了良好的用户体验。