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.

5.3 KiB

人脸验证502错误处理修复

问题描述

在进行人脸验证时,checkOrder 接口返回502错误,导致:

  1. 系统仍会重试请求(虽然已修复 verifyOrder 接口,但 checkOrder 接口未修复)
  2. 人脸识别摄像头预览被暂停,且502错误时未恢复摄像头
  3. 用户无法看到友好的错误提示

日志分析

2025-09-10 18:22:24.067 NetworkStabilityManager: 服务器错误 502,准备重试 2

这表明 checkOrder 接口的502错误仍然进入了重试逻辑。

修复方案

1. NetworkUtils.checkOrder 502错误处理优化

文件: c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\network\utils\NetworkUtils.java

问题: checkOrder 接口缺少针对502错误的友好提示,只使用通用的HTTP错误信息。

修复: 在 checkOrder 方法的错误处理中添加502错误的特殊处理:

// 修复前
} else {
    // 处理HTTP错误状态码,如404、500等
    String errorMessage = getHttpErrorMessage(response.code());
    android.util.Log.e("NetworkUtils", "HTTP Error: " + response.code() + " - " + errorMessage);
    callback.onError(response.code(), errorMessage);
}

// 修复后
} else {
    // 处理HTTP错误状态码,如404、500等
    String errorMessage = getHttpErrorMessage(response.code());
    if (response.code() == 502) {
        // 对于502错误,提供更具体的说明
        errorMessage = "服务器暂时不可用,请稍后再试";
    }
    android.util.Log.e("NetworkUtils", "HTTP Error: " + response.code() + " - " + errorMessage);
    callback.onError(response.code(), errorMessage);
}

2. OrderVerificationResultHandler 502错误的摄像头恢复处理

文件: c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\network\OrderVerificationResultHandler.java

问题: 只有303和504错误会恢复摄像头预览,502错误没有恢复摄像头的处理。

修复: 添加502错误的特殊处理逻辑:

// 当人脸验证返回502错误时,显示Toast并恢复摄像头预览
if (verificationType == OrderVerificationManager.TYPE_FACE_VERIFICATION && errorCode == 502) {
    LogManager.logInfo(TAG, "人脸验证返回502,显示Toast并恢复摄像头预览");
    
    // 显示友好的错误提示
    String displayMessage = getDisplayErrorMessage(errorCode, errorMessage);
    if (listener != null) {
        listener.showToast(displayMessage != null && !displayMessage.isEmpty() ? displayMessage : "服务器暂时不可用,请稍后再试");
    }
    
    // 发送广播通知OXFaceOnlineActivity恢复摄像头预览
    try {
        Intent intent = new Intent("com.ouxuan.oxface.ACTION_RESUME_CAMERA");
        context.sendBroadcast(intent);
        LogManager.logInfo(TAG, "已发送恢复摄像头预览广播");
    } catch (Exception e) {
        LogManager.logError(TAG, "发送恢复摄像头预览广播失败", e);
    }
    
    return;
}

修复效果

修复前的问题

  1. 重试日志: 服务器错误 502,准备重试 2
  2. 错误信息: 通用的"网关错误"
  3. 摄像头状态: 暂停且不恢复
  4. 用户体验: 等待重试,无友好提示

修复后的效果

  1. 立即处理: 502错误被 NetworkStabilityManager 立即捕获,不重试
  2. 友好提示: 显示"服务器暂时不可用,请稍后再试"
  3. 摄像头恢复: 自动发送恢复摄像头预览的广播
  4. 用户体验: 即时反馈,摄像头立即恢复可用

处理流程

  1. 网络层: NetworkStabilityManager.RetryInterceptor 检测到502错误,立即返回不重试
  2. 工具层: NetworkUtils.checkOrder 接收502响应,生成友好错误信息
  3. 管理层: OrderVerificationManager 调用错误回调
  4. 处理层: OrderVerificationResultHandler 检测到人脸验证502错误
  5. 界面层: 显示Toast提示
  6. 广播层: 发送恢复摄像头广播
  7. 设备层: OXFaceOnlineActivity 接收广播,调用 resumeCamera()

兼容性

  • 保持与现有错误处理逻辑的兼容性
  • 不影响其他验证类型的错误处理
  • 保持303和504错误的原有处理逻辑
  • 向后兼容现有的摄像头控制机制

测试验证

验证点

  1. 502错误不重试: 检查日志中不再出现"准备重试"信息
  2. 错误信息友好: Toast显示"服务器暂时不可用,请稍后再试"
  3. 摄像头恢复: 验证摄像头预览在502错误后能正常恢复
  4. 其他错误不受影响: 确保303、504等错误的处理不变

预期日志

NetworkStabilityManager: 服务器错误 502 (Bad Gateway),直接返回错误
OrderVerificationResultHandler: 人脸验证返回502,显示Toast并恢复摄像头预览
OrderVerificationResultHandler: 已发送恢复摄像头预览广播
OXFaceOnlineActivity: 接收到恢复摄像头预览广播

总结

通过这次修复,完善了502错误在人脸验证场景下的处理:

  1. 网络层: 已在 v2.0.2 中修复502错误重试问题
  2. 业务层: 本次修复502错误的友好提示和摄像头恢复
  3. 用户体验: 从等待重试改为即时反馈和设备恢复

现在当人脸验证遇到502错误时,用户将看到友好的提示信息,摄像头也会立即恢复预览,提供了更好的用户体验。