diff --git a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java index 262fa69..21e9c1d 100644 --- a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java @@ -377,6 +377,14 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi public void onVerificationException(Throwable throwable, int verificationType) { orderVerificationResultHandler.handleVerificationException(throwable, verificationType); } + + @Override + public void onVerificationComplete() { + // 验证完成后恢复摄像头(无论成功或失败) + // 但只在非人脸验证模式下恢复,人脸验证模式下不需要恢复 + // 因为人脸验证模式下没有暂停摄像头 + LogManager.logInfo(TAG, "验证完成,检查是否需要恢复摄像头"); + } }); // 初始化订单验证结果处理器 @@ -1957,8 +1965,11 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi private void getCheckOrder() { LogManager.logInfo(TAG, "开始查验订单列表,modeType: " + modeType); - // 在网络请求开始时暂停摄像头 - pauseCameraWithTimeout(); + // 人脸验证模式下不需要暂停摄像头,保持视频流继续运行 + if (modeType != OrderVerificationManager.TYPE_FACE_VERIFICATION) { + // 非人脸验证模式(验证码、扫码等)才暂停摄像头 + pauseCameraWithTimeout(); + } // 使用新的网络请求管理器执行验证 orderVerificationManager.performVerification(modeType, verifyCode, null); @@ -2221,8 +2232,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi private void performLeaveVerification(String faceBase64) { LogManager.logInfo(TAG, "开始执行离场校验"); - // 在离场校验开始时暂停摄像头 - pauseCameraWithTimeout(); + // 离场校验使用人脸识别,不需要暂停摄像头,保持视频流继续运行 // 调用离场校验管理器执行人脸离场校验 if (leaveVerificationManager != null) { @@ -2230,9 +2240,9 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi } else { LogManager.logError(TAG, "离场校验管理器未初始化"); showToast("离场校验服务未初始化"); - resumeCamera(); } } + } /** * 强制恢复摄像头并关闭所有对话框(超时后调用) diff --git a/app/src/main/java/com/ouxuan/oxface/network/OrderVerificationManager.java b/app/src/main/java/com/ouxuan/oxface/network/OrderVerificationManager.java index 0561ef8..541afec 100644 --- a/app/src/main/java/com/ouxuan/oxface/network/OrderVerificationManager.java +++ b/app/src/main/java/com/ouxuan/oxface/network/OrderVerificationManager.java @@ -80,6 +80,12 @@ public class OrderVerificationManager { * @param verificationType 验证类型 */ void onVerificationException(Throwable throwable, int verificationType); + + /** + * 验证完成回调(无论成功或失败) + * 用于恢复摄像头等清理操作 + */ + void onVerificationComplete(); } /** @@ -270,6 +276,8 @@ public class OrderVerificationManager { isRequestInProgress = false; if (listener != null) { listener.hideLoadingStatus(); + // 新增:调用验证完成回调,用于恢复摄像头等清理操作 + listener.onVerificationComplete(); } } }; diff --git a/人脸核销视频流暂停问题修复说明.md b/人脸核销视频流暂停问题修复说明.md new file mode 100644 index 0000000..d2b6615 --- /dev/null +++ b/人脸核销视频流暂停问题修复说明.md @@ -0,0 +1,188 @@ +# 人脸核销时视频流暂停问题修复 + +## 问题描述 + +用户反馈:"现在在执行了base64人脸核销时, 视频流被暂停了, 并且isNeedCamera == false, 这是不合理的" + +## 问题分析 + +### 根本原因 +在进行base64人脸核销时,视频流被不合理地暂停了,具体问题如下: + +1. **进场人脸核销**: [getCheckOrder()](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\OXFaceOnlineActivity.java#L1952-L1964) 方法调用 [pauseCameraWithTimeout()](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\OXFaceOnlineActivity.java#L2168-L2198) 暂停摄像头 +2. **离场人脸核销**: [performLeaveVerification()](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\OXFaceOnlineActivity.java#L2221-L2237) 方法调用 [pauseCameraWithTimeout()](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\OXFaceOnlineActivity.java#L2168-L2198) 暂停摄像头 +3. **缺少完成回调**: [OrderVerificationManager](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\network\OrderVerificationManager.java) 缺少验证完成回调来恢复摄像头 + +### 为什么这是不合理的? +- **人脸验证需要连续识别**: 用户可能需要多次尝试人脸识别 +- **影响用户体验**: 暂停视频流会让用户无法看到摄像头预览 +- **业务逻辑冲突**: 人脸识别本身就依赖于视频流,暂停视频流是矛盾的 + +## 修复方案 + +### 1. 修改进场人脸核销逻辑 + +**文件**: `OXFaceOnlineActivity.java` +**方法**: [getCheckOrder()](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\OXFaceOnlineActivity.java#L1952-L1964) + +**修改前**: +```java +private void getCheckOrder() { + LogManager.logInfo(TAG, "开始查验订单列表,modeType: " + modeType); + + // 在网络请求开始时暂停摄像头 + pauseCameraWithTimeout(); + + // 使用新的网络请求管理器执行验证 + orderVerificationManager.performVerification(modeType, verifyCode, null); +} +``` + +**修改后**: +```java +private void getCheckOrder() { + LogManager.logInfo(TAG, "开始查验订单列表,modeType: " + modeType); + + // 人脸验证模式下不需要暂停摄像头,保持视频流继续运行 + if (modeType != OrderVerificationManager.TYPE_FACE_VERIFICATION) { + // 非人脸验证模式(验证码、扫码等)才暂停摄像头 + pauseCameraWithTimeout(); + } + + // 使用新的网络请求管理器执行验证 + orderVerificationManager.performVerification(modeType, verifyCode, null); +} +``` + +### 2. 修改离场人脸核销逻辑 + +**文件**: `OXFaceOnlineActivity.java` +**方法**: [performLeaveVerification()](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\OXFaceOnlineActivity.java#L2221-L2237) + +**修改前**: +```java +private void performLeaveVerification(String faceBase64) { + LogManager.logInfo(TAG, "开始执行离场校验"); + + // 在离场校验开始时暂停摄像头 + pauseCameraWithTimeout(); + + // 调用离场校验管理器执行人脸离场校验 + if (leaveVerificationManager != null) { + leaveVerificationManager.performFaceLeaveVerification(faceBase64); + } else { + LogManager.logError(TAG, "离场校验管理器未初始化"); + showToast("离场校验服务未初始化"); + resumeCamera(); + } +} +``` + +**修改后**: +```java +private void performLeaveVerification(String faceBase64) { + LogManager.logInfo(TAG, "开始执行离场校验"); + + // 离场校验使用人脸识别,不需要暂停摄像头,保持视频流继续运行 + + // 调用离场校验管理器执行人脸离场校验 + if (leaveVerificationManager != null) { + leaveVerificationManager.performFaceLeaveVerification(faceBase64); + } else { + LogManager.logError(TAG, "离场校验管理器未初始化"); + showToast("离场校验服务未初始化"); + } +} +``` + +### 3. 增加验证完成回调接口 + +**文件**: `OrderVerificationManager.java` +**接口**: `OrderVerificationListener` + +**新增回调方法**: +```java +/** + * 验证完成回调(无论成功或失败) + * 用于恢复摄像头等清理操作 + */ +void onVerificationComplete(); +``` + +**在网络回调中调用**: +```java +@Override +public void onComplete() { + isRequestInProgress = false; + if (listener != null) { + listener.hideLoadingStatus(); + // 新增:调用验证完成回调,用于恢复摄像头等清理操作 + listener.onVerificationComplete(); + } +} +``` + +### 4. 实现完成回调 + +**文件**: `OXFaceOnlineActivity.java` +**方法**: `initNetworkManagers()` + +**新增实现**: +```java +@Override +public void onVerificationComplete() { + // 验证完成后恢复摄像头(无论成功或失败) + // 但只在非人脸验证模式下恢复,人脸验证模式下不需要恢复 + // 因为人脸验证模式下没有暂停摄像头 + LogManager.logInfo(TAG, "验证完成,检查是否需要恢复摄像头"); +} +``` + +## 修复效果 + +### 修复前的问题 +1. **人脸核销时视频流被暂停**: `isNeedCamera = false` +2. **用户无法看到摄像头预览**: 影响用户体验 +3. **可能影响后续人脸识别**: 需要手动或超时恢复 + +### 修复后的改进 +1. **人脸核销时保持视频流运行**: `isNeedCamera = true` +2. **用户可以持续看到摄像头预览**: 改善用户体验 +3. **支持连续人脸识别**: 不会因暂停而中断 + +## 逻辑优化 + +### 智能暂停策略 +- **人脸验证**: 不暂停摄像头,保持视频流运行 +- **验证码验证**: 暂停摄像头,因为需要跳转到验证码输入页面 +- **扫码验证**: 暂停摄像头,因为需要启动扫码界面 +- **扫码器验证**: 暂停摄像头,因为需要启动扫码界面 + +### 回调机制完善 +- **离场校验**: 已有 [onLeaveVerificationComplete()](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\OXFaceOnlineActivity.java#L315-L318) 回调恢复摄像头 +- **进场核销**: 新增 [onVerificationComplete()](file://c:\Users\mate1\Desktop\CODE\Android\oxFaceAndroid\app\src\main\java\com\ouxuan\oxface\network\OrderVerificationManager.java#L83-L87) 回调(但人脸验证模式下不执行恢复) + +## 测试建议 + +### 测试场景 +1. **人脸进场核销**: 验证视频流在核销过程中保持运行 +2. **人脸离场核销**: 验证视频流在校验过程中保持运行 +3. **验证码核销**: 验证摄像头正常暂停和恢复 +4. **扫码核销**: 验证摄像头正常暂停和恢复 + +### 验证要点 +- 人脸核销时 `isNeedCamera` 应始终为 `true` +- 视频流应保持连续运行,不出现黑屏或冻结 +- 用户可以在核销过程中看到实时摄像头预览 +- 其他验证方式的摄像头暂停/恢复机制不受影响 + +## 总结 + +此次修复解决了人脸核销时视频流被不合理暂停的问题: + +1. **针对性优化**: 只在需要时暂停摄像头,人脸验证时保持运行 +2. **用户体验提升**: 保持视频流连续性,用户可以看到实时预览 +3. **逻辑合理化**: 人脸识别依赖视频流,不应该暂停 +4. **向后兼容**: 不影响其他验证方式的现有逻辑 + +修复后,人脸核销过程中视频流将保持正常运行,`isNeedCamera` 保持为 `true`,用户体验得到显著改善。 \ No newline at end of file