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
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. 密码验证机制
验证逻辑:
- 获取用户输入的密码
- 从
LoginDataManager
获取本地存储的登录密码 - 进行字符串比较验证
- 验证成功:调用
unLockAndLeaveFaceDetect()
方法 - 验证失败:显示红色错误提示,清空输入框
安全特性:
- 密码以密文形式显示
- 错误时提供明确的用户反馈
- 支持键盘回车确认
4. 解锁退出功能 (unLockAndLeaveFaceDetect()
)
执行流程:
- 停止摄像头预览
- 创建返回登录界面的Intent
- 设置Intent标志(清除任务栈)
- 启动MainActivity(登录界面)
- 结束当前人脸识别界面
- 记录详细的操作日志
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. 普通用户使用
- 在人脸识别界面,连续快速点击左上角店铺名称6次
- 或者等待门禁不可用弹窗出现时,连续快速点击弹窗标题6次
- 在弹出的解锁密码弹窗中输入登录密码
- 点击确认或按回车键
- 密码正确后自动返回登录界面
2. 开发者调试
- 查看日志中的 "解锁" 相关信息
- 验证点击计数和密码验证逻辑
- 检查摄像头暂停/恢复状态
安全性考虑
1. 访问控制
- 隐蔽的触发方式(连续6次点击)
- 密码验证机制
- 无明显的UI提示(防止误操作)
2. 密码安全
- 使用现有的登录密码验证
- 密文显示输入内容
- 错误时不显示具体的密码信息
3. 日志安全
- 不记录用户输入的密码
- 只记录验证成功/失败的结果
- 详细记录操作流程便于调试
测试建议
1. 功能测试
- 测试两种触发方式
- 测试正确和错误密码的处理
- 测试摄像头暂停/恢复功能
- 测试解锁后的界面跳转
2. 界面测试
- 不同屏幕尺寸的适配
- 横竖屏切换(如支持)
- 软键盘弹出和收起
- 错误提示的显示和隐藏
3. 异常测试
- 密码为空的处理
- 网络异常时的处理
- 内存不足时的处理
- 快速重复操作的处理
维护说明
1. 常见问题排查
- 检查
LoginDataManager
中是否有保存的密码 - 确认点击计数逻辑是否正确
- 验证摄像头控制广播是否正常
2. 代码修改建议
- 若需修改触发次数,修改
MAX_CLICK_COUNT
和TITLE_MAX_CLICK_COUNT
常量 - 若需修改UI样式,在
createDialog()
方法中调整 - 若需修改密码验证逻辑,在
handleConfirm()
方法中调整
3. 日志查看
- 搜索 "解锁" 关键字查看相关日志
- 搜索 "点击" 关键字查看触发日志
- 搜索 "密码" 关键字查看验证日志(不包含实际密码)
总结
本实现完全满足了用户的需求: ✅ 两种隐蔽的触发方式(店铺名称和弹窗标题) ✅ 美观简洁的弹窗界面 ✅ 安全的密码验证机制 ✅ 完整的摄像头控制集成 ✅ 可靠的解锁退出功能 ✅ 符合主题色的界面设计 ✅ 完善的错误处理和日志记录
该功能为特殊情况下的程序退出提供了安全可靠的解决方案,既保证了系统的安全性,又提供了良好的用户体验。