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.

7.4 KiB

人脸核销时视频流暂停问题修复

问题描述

用户反馈:"现在在执行了base64人脸核销时, 视频流被暂停了, 并且isNeedCamera == false, 这是不合理的"

问题分析

根本原因

在进行base64人脸核销时,视频流被不合理地暂停了,具体问题如下:

  1. 进场人脸核销: getCheckOrder() 方法调用 pauseCameraWithTimeout() 暂停摄像头
  2. 离场人脸核销: performLeaveVerification() 方法调用 pauseCameraWithTimeout() 暂停摄像头
  3. 缺少完成回调: OrderVerificationManager 缺少验证完成回调来恢复摄像头

为什么这是不合理的?

  • 人脸验证需要连续识别: 用户可能需要多次尝试人脸识别
  • 影响用户体验: 暂停视频流会让用户无法看到摄像头预览
  • 业务逻辑冲突: 人脸识别本身就依赖于视频流,暂停视频流是矛盾的

修复方案

1. 修改进场人脸核销逻辑

文件: OXFaceOnlineActivity.java
方法: getCheckOrder()

修改前:

private void getCheckOrder() {
    LogManager.logInfo(TAG, "开始查验订单列表,modeType: " + modeType);
    
    // 在网络请求开始时暂停摄像头
    pauseCameraWithTimeout();
    
    // 使用新的网络请求管理器执行验证
    orderVerificationManager.performVerification(modeType, verifyCode, null);
}

修改后:

private void getCheckOrder() {
    LogManager.logInfo(TAG, "开始查验订单列表,modeType: " + modeType);
    
    // 人脸验证模式下不需要暂停摄像头,保持视频流继续运行
    if (modeType != OrderVerificationManager.TYPE_FACE_VERIFICATION) {
        // 非人脸验证模式(验证码、扫码等)才暂停摄像头
        pauseCameraWithTimeout();
    }
    
    // 使用新的网络请求管理器执行验证
    orderVerificationManager.performVerification(modeType, verifyCode, null);
}

2. 修改离场人脸核销逻辑

文件: OXFaceOnlineActivity.java
方法: performLeaveVerification()

修改前:

private void performLeaveVerification(String faceBase64) {
    LogManager.logInfo(TAG, "开始执行离场校验");
    
    // 在离场校验开始时暂停摄像头
    pauseCameraWithTimeout();
    
    // 调用离场校验管理器执行人脸离场校验
    if (leaveVerificationManager != null) {
        leaveVerificationManager.performFaceLeaveVerification(faceBase64);
    } else {
        LogManager.logError(TAG, "离场校验管理器未初始化");
        showToast("离场校验服务未初始化");
        resumeCamera();
    }
}

修改后:

private void performLeaveVerification(String faceBase64) {
    LogManager.logInfo(TAG, "开始执行离场校验");
    
    // 离场校验使用人脸识别,不需要暂停摄像头,保持视频流继续运行
    
    // 调用离场校验管理器执行人脸离场校验
    if (leaveVerificationManager != null) {
        leaveVerificationManager.performFaceLeaveVerification(faceBase64);
    } else {
        LogManager.logError(TAG, "离场校验管理器未初始化");
        showToast("离场校验服务未初始化");
    }
}

3. 增加验证完成回调接口

文件: OrderVerificationManager.java
接口: OrderVerificationListener

新增回调方法:

/**
 * 验证完成回调(无论成功或失败)
 * 用于恢复摄像头等清理操作
 */
void onVerificationComplete();

在网络回调中调用:

@Override
public void onComplete() {
    isRequestInProgress = false;
    if (listener != null) {
        listener.hideLoadingStatus();
        // 新增:调用验证完成回调,用于恢复摄像头等清理操作
        listener.onVerificationComplete();
    }
}

4. 实现完成回调

文件: OXFaceOnlineActivity.java
方法: initNetworkManagers()

新增实现:

@Override
public void onVerificationComplete() {
    // 验证完成后恢复摄像头(无论成功或失败)
    // 但只在非人脸验证模式下恢复,人脸验证模式下不需要恢复
    // 因为人脸验证模式下没有暂停摄像头
    LogManager.logInfo(TAG, "验证完成,检查是否需要恢复摄像头");
}

修复效果

修复前的问题

  1. 人脸核销时视频流被暂停: isNeedCamera = false
  2. 用户无法看到摄像头预览: 影响用户体验
  3. 可能影响后续人脸识别: 需要手动或超时恢复

修复后的改进

  1. 人脸核销时保持视频流运行: isNeedCamera = true
  2. 用户可以持续看到摄像头预览: 改善用户体验
  3. 支持连续人脸识别: 不会因暂停而中断

逻辑优化

智能暂停策略

  • 人脸验证: 不暂停摄像头,保持视频流运行
  • 验证码验证: 暂停摄像头,因为需要跳转到验证码输入页面
  • 扫码验证: 暂停摄像头,因为需要启动扫码界面
  • 扫码器验证: 暂停摄像头,因为需要启动扫码界面

回调机制完善

  • 离场校验: 已有 onLeaveVerificationComplete() 回调恢复摄像头
  • 进场核销: 新增 onVerificationComplete() 回调(但人脸验证模式下不执行恢复)

测试建议

测试场景

  1. 人脸进场核销: 验证视频流在核销过程中保持运行
  2. 人脸离场核销: 验证视频流在校验过程中保持运行
  3. 验证码核销: 验证摄像头正常暂停和恢复
  4. 扫码核销: 验证摄像头正常暂停和恢复

验证要点

  • 人脸核销时 isNeedCamera 应始终为 true
  • 视频流应保持连续运行,不出现黑屏或冻结
  • 用户可以在核销过程中看到实时摄像头预览
  • 其他验证方式的摄像头暂停/恢复机制不受影响

总结

此次修复解决了人脸核销时视频流被不合理暂停的问题:

  1. 针对性优化: 只在需要时暂停摄像头,人脸验证时保持运行
  2. 用户体验提升: 保持视频流连续性,用户可以看到实时预览
  3. 逻辑合理化: 人脸识别依赖视频流,不应该暂停
  4. 向后兼容: 不影响其他验证方式的现有逻辑

修复后,人脸核销过程中视频流将保持正常运行,isNeedCamera 保持为 true,用户体验得到显著改善。