oxFaceAndroid
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6.3 KiB

解锁密码弹窗功能实现说明

功能概述

本次实现了解锁密码弹窗功能,为特殊情况下退出人脸识别界面提供了一个安全的出口。该功能完全符合用户需求,提供了美观简洁的界面和安全的密码验证机制。

实现的功能

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. 类结构设计

// 主要类和接口
- 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_COUNTTITLE_MAX_CLICK_COUNT 常量
  • 若需修改UI样式,在 createDialog() 方法中调整
  • 若需修改密码验证逻辑,在 handleConfirm() 方法中调整

3. 日志查看

  • 搜索 "解锁" 关键字查看相关日志
  • 搜索 "点击" 关键字查看触发日志
  • 搜索 "密码" 关键字查看验证日志(不包含实际密码)

总结

本实现完全满足了用户的需求: 两种隐蔽的触发方式(店铺名称和弹窗标题) 美观简洁的弹窗界面 安全的密码验证机制 完整的摄像头控制集成 可靠的解锁退出功能 符合主题色的界面设计 完善的错误处理和日志记录

该功能为特殊情况下的程序退出提供了安全可靠的解决方案,既保证了系统的安全性,又提供了良好的用户体验。