diff --git a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java index e67a0ec..2f4d843 100644 --- a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java @@ -628,6 +628,8 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { startTestOpenDebugRegisterFunction(); + }else{ + LogManager.logInfo(TAG, "OXFaceOnlineActivity onResume has not CAMERA permission"); } LogManager.logInfo(TAG, "OXFaceOnlineActivity onResume"); } @@ -918,30 +920,30 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi /** * 处理扫码按钮点击事件 */ - private void handleScanQRClick() { - LogManager.logInfo(TAG, "用户点击扫码按钮"); - Toast.makeText(this, "扫码功能已触发", Toast.LENGTH_SHORT).show(); - - // 这里可以添加实际的扫码逻辑 - // 例如:启动扫码Activity或显示扫码界面 - - // 显示扫码状态 - if (layoutCompareStatus != null) { - layoutCompareStatus.setVisibility(View.VISIBLE); - textCompareStatus.setTextColor(Color.parseColor("#009874")); - textCompareStatus.setText("请将二维码对准扫描区域"); - - // 3秒后隐藏状态提示 - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - if (layoutCompareStatus != null) { - layoutCompareStatus.setVisibility(View.GONE); - } - } - }, 3000); - } - } + // private void handleScanQRClick() { + // LogManager.logInfo(TAG, "用户点击扫码按钮"); + // Toast.makeText(this, "扫码功能已触发", Toast.LENGTH_SHORT).show(); + + // // 这里可以添加实际的扫码逻辑 + // // 例如:启动扫码Activity或显示扫码界面 + + // // 显示扫码状态 + // if (layoutCompareStatus != null) { + // layoutCompareStatus.setVisibility(View.VISIBLE); + // textCompareStatus.setTextColor(Color.parseColor("#009874")); + // textCompareStatus.setText("请将二维码对准扫描区域"); + + // // 3秒后隐藏状态提示 + // new Handler().postDelayed(new Runnable() { + // @Override + // public void run() { + // if (layoutCompareStatus != null) { + // layoutCompareStatus.setVisibility(View.GONE); + // } + // } + // }, 3000); + // } + // } /** * 处理设置按钮点击事件 @@ -1045,37 +1047,74 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi /** * 处理扫码器开门点击事件 */ - private void handleScannerDoorClick() { + private void handleScannerDoorClick2() { LogManager.logInfo(TAG, "用户点击扫码器开门"); - Toast.makeText(this, "扫码器开门功能已触发", Toast.LENGTH_SHORT).show(); - - Intent intent = new Intent(this, OrderVerificationResultActivity.class); - intent.putExtra("verification_type", 1); // 1-验证码验证, 4-扫码器验证 - intent.putExtra("order_no", "订单号"); - intent.putExtra("verification_code", "验证码"); - intent.putExtra("order_type", "订单类型"); - intent.putExtra("card_no", "卡号"); - intent.putExtra("status", "核销状态"); - startActivity(intent); - // 这里可以添加实际的扫码器开门逻辑 - // 例如:启动扫码器Activity或显示扫码器界面 + + // 检查是否有正在进行的人脸识别请求 + if (orderVerificationManager != null && orderVerificationManager.isRequestInProgress()) { + LogManager.logInfo(TAG, "有正在进行的订单验证请求,取消扫码操作"); + Toast.makeText(this, "正在处理其他请求,请稍后再试", Toast.LENGTH_SHORT).show(); + return; + } + + // 暂停摄像头预览 + pauseCameraWithTimeout(); + LogManager.logInfo(TAG, "已暂停摄像头预览"); + + // 调用华为统一扫码功能 + com.ouxuan.oxface.device.HuaWeiScanManager.doScan(this, new com.ouxuan.oxface.device.HuaWeiScanManager.ScanResultListener() { + @Override + public void onScanSuccess(String scanResult) { + LogManager.logInfo(TAG, "华为扫码器扫码成功,结果: " + scanResult); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(OXFaceOnlineActivity.this, "扫码成功: " + scanResult, Toast.LENGTH_SHORT).show(); + + // 设置模式为4(扫码器验证) + modeType = OrderVerificationManager.TYPE_SCANNER_VERIFICATION; + verifyCode = scanResult; + + // 执行扫码器核销 + getCheckOrder(); + } + }); + } - // 显示状态提示 - if (layoutCompareStatus != null) { - layoutCompareStatus.setVisibility(View.VISIBLE); - textCompareStatus.setTextColor(Color.parseColor("#009874")); - textCompareStatus.setText("请使用扫码器开门"); + @Override + public void onScanFailed(int errorCode, String errorMsg) { + LogManager.logError(TAG, "华为扫码器扫码失败,错误码: " + errorCode + ", 错误信息: " + errorMsg); + + // 恢复摄像头预览 + resumeCamera(); + LogManager.logInfo(TAG, "扫码失败,已恢复摄像头预览"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(OXFaceOnlineActivity.this, "扫码失败: " + errorMsg, Toast.LENGTH_SHORT).show(); + + // 显示状态提示 + if (layoutCompareStatus != null) { + layoutCompareStatus.setVisibility(View.VISIBLE); + textCompareStatus.setTextColor(Color.parseColor("#FF0000")); + textCompareStatus.setText("扫码失败: " + errorMsg); - // 3秒后隐藏状态提示 - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - if (layoutCompareStatus != null) { - layoutCompareStatus.setVisibility(View.GONE); + // 3秒后隐藏状态提示 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (layoutCompareStatus != null) { + layoutCompareStatus.setVisibility(View.GONE); + } + } + }, 3000); + } } - } - }, 3000); - } + }); + } + }); } @Override @@ -1644,6 +1683,51 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); + // 处理华为扫码结果 + boolean handled = com.ouxuan.oxface.device.HuaWeiScanManager.handleScanResult(requestCode, resultCode, data, new com.ouxuan.oxface.device.HuaWeiScanManager.ScanResultListener() { + @Override + public void onScanSuccess(String scanResult) { + LogManager.logInfo(TAG, "华为扫码成功,结果: " + scanResult); + Log.d(TAG, "扫码结果: " + scanResult); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(OXFaceOnlineActivity.this, "扫码成功: " + scanResult, Toast.LENGTH_SHORT).show(); + + // 调用checkOrder函数进行扫码核销 + performScanVerification(); + } + }); + } + + @Override + public void onScanFailed(int errorCode, String errorMsg) { + LogManager.logError(TAG, "华为扫码失败,错误码: " + errorCode + ", 错误信息: " + errorMsg); + Log.e(TAG, "扫码失败,错误码: " + errorCode + ", 错误信息: " + errorMsg); + + // 恢复摄像头预览 + resumeCamera(); + LogManager.logInfo(TAG, "扫码失败,已恢复摄像头预览"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(OXFaceOnlineActivity.this, "扫码失败: " + errorMsg, Toast.LENGTH_SHORT).show(); + } + }); + } + }); + + if (handled) { + // 如果已经处理了扫码结果,也需要恢复摄像头预览 + if (requestCode == com.ouxuan.oxface.device.HuaWeiScanManager.REQUEST_CODE_SCAN) { + resumeCamera(); + LogManager.logInfo(TAG, "华为扫码完成,已恢复摄像头预览"); + } + return; // 如果已经处理了扫码结果,则直接返回 + } + if (requestCode == 1001) { // 验证码验证获取输入结果 // 恢复摄像头预览 resumeCamera(); @@ -1795,6 +1879,131 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi } /** + * 处理扫码按钮点击事件 + */ + private void handleScanQRClick() { + LogManager.logInfo(TAG, "用户点击扫码按钮"); + + // 调用华为统一扫码功能 + com.ouxuan.oxface.device.HuaWeiScanManager.doScan(this, new com.ouxuan.oxface.device.HuaWeiScanManager.ScanResultListener() { + @Override + public void onScanSuccess(String scanResult) { + // 输出扫码结果到log + LogManager.logInfo(TAG, "华为扫码成功,结果: " + scanResult); + Log.d(TAG, "扫码结果: " + scanResult); + + // 显示扫码结果Toast + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(OXFaceOnlineActivity.this, "扫码成功: " + scanResult, Toast.LENGTH_SHORT).show(); + + // 调用checkOrder函数进行扫码核销 + performScanVerification(); + } + }); + } + + @Override + public void onScanFailed(int errorCode, String errorMsg) { + LogManager.logError(TAG, "华为扫码失败,错误码: " + errorCode + ", 错误信息: " + errorMsg); + Log.e(TAG, "扫码失败,错误码: " + errorCode + ", 错误信息: " + errorMsg); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(OXFaceOnlineActivity.this, "扫码失败: " + errorMsg, Toast.LENGTH_SHORT).show(); + } + }); + } + }); + } + + /** + * 处理扫码器开门点击事件 + */ + private void handleScannerDoorClick() { + LogManager.logInfo(TAG, "用户点击扫码器开门"); + + // 检查是否有正在进行的人脸识别请求 + if (orderVerificationManager != null && orderVerificationManager.isRequestInProgress()) { + LogManager.logInfo(TAG, "有正在进行的订单验证请求,取消扫码操作"); + Toast.makeText(this, "正在处理其他请求,请稍后再试", Toast.LENGTH_SHORT).show(); + return; + } + + // 暂停摄像头预览 + pauseCameraWithTimeout(); + LogManager.logInfo(TAG, "已暂停摄像头预览"); + + // 调用华为统一扫码功能 + com.ouxuan.oxface.device.HuaWeiScanManager.doScan(this, new com.ouxuan.oxface.device.HuaWeiScanManager.ScanResultListener() { + @Override + public void onScanSuccess(String scanResult) { + LogManager.logInfo(TAG, "华为扫码器扫码成功,结果: " + scanResult); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(OXFaceOnlineActivity.this, "扫码成功: " + scanResult, Toast.LENGTH_SHORT).show(); + + // 设置模式为4(扫码器验证) + modeType = OrderVerificationManager.TYPE_SCANNER_VERIFICATION; + verifyCode = scanResult; + + // 执行扫码器核销(注意:getCheckOrder会再次暂停摄像头,所以我们不需要在这里恢复) + getCheckOrder(); + } + }); + } + + @Override + public void onScanFailed(int errorCode, String errorMsg) { + LogManager.logError(TAG, "华为扫码器扫码失败,错误码: " + errorCode + ", 错误信息: " + errorMsg); + + // 恢复摄像头预览 + resumeCamera(); + LogManager.logInfo(TAG, "扫码失败,已恢复摄像头预览"); + + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(OXFaceOnlineActivity.this, "扫码失败: " + errorMsg, Toast.LENGTH_SHORT).show(); + + // 显示状态提示 + if (layoutCompareStatus != null) { + layoutCompareStatus.setVisibility(View.VISIBLE); + textCompareStatus.setTextColor(Color.parseColor("#FF0000")); + textCompareStatus.setText("扫码失败: " + errorMsg); + + // 3秒后隐藏状态提示 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + if (layoutCompareStatus != null) { + layoutCompareStatus.setVisibility(View.GONE); + } + } + }, 3000); + } + } + }); + } + }); + } + + /** + * 执行扫码核销 + */ + private void performScanVerification() { + // 设置模式为3(扫码验证) + modeType = OrderVerificationManager.TYPE_SCAN_VERIFICATION; + + // 调用订单查询方法进行扫码验证 + getCheckOrder(); + } + + /** * 显示加载状态 */ private void showLoadingStatus(String message) { diff --git a/app/src/main/java/com/ouxuan/oxface/network/NetworkStatusIndicator.java b/app/src/main/java/com/ouxuan/oxface/network/NetworkStatusIndicator.java index 581375e..5336874 100644 --- a/app/src/main/java/com/ouxuan/oxface/network/NetworkStatusIndicator.java +++ b/app/src/main/java/com/ouxuan/oxface/network/NetworkStatusIndicator.java @@ -176,6 +176,15 @@ public class NetworkStatusIndicator { } /** + * 确保执行器可用 + */ + private void ensureExecutorAvailable() { + if (scheduledExecutor == null || scheduledExecutor.isShutdown()) { + initExecutor(); + } + } + + /** * 开始网络状态监控 */ public void startMonitoring() { @@ -184,6 +193,9 @@ public class NetworkStatusIndicator { return; } + // 确保执行器可用 + ensureExecutorAvailable(); + isMonitoring = true; // 立即检查一次 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 b69222d..0561ef8 100644 --- a/app/src/main/java/com/ouxuan/oxface/network/OrderVerificationManager.java +++ b/app/src/main/java/com/ouxuan/oxface/network/OrderVerificationManager.java @@ -27,6 +27,9 @@ public class OrderVerificationManager { private DeviceSelectDataManager deviceDataManager; private OrderVerificationListener listener; + // 添加标志来跟踪是否有正在进行的请求 + private boolean isRequestInProgress = false; + /** * 订单验证结果监听器 */ @@ -92,6 +95,14 @@ public class OrderVerificationManager { } /** + * 检查是否有正在进行的请求 + * @return 是否有正在进行的请求 + */ + public boolean isRequestInProgress() { + return isRequestInProgress; + } + + /** * 执行订单验证 * @param verificationType 验证类型 * @param verifyCode 验证码或人脸base64数据 @@ -100,12 +111,16 @@ public class OrderVerificationManager { public void performVerification(int verificationType, String verifyCode, String decryptText) { LogManager.logInfo(TAG, "开始执行订单验证,类型: " + verificationType); + // 设置请求进行中的标志 + isRequestInProgress = true; + // 获取认证信息 String token = getAuthToken(); int hardwareId = getHardwareId(); // 参数校验 if (!validateParams(token, hardwareId)) { + isRequestInProgress = false; return; } @@ -128,6 +143,7 @@ public class OrderVerificationManager { if (listener != null) { listener.showToast("不支持的验证类型"); } + isRequestInProgress = false; break; } } @@ -251,6 +267,7 @@ public class OrderVerificationManager { @Override public void onComplete() { + isRequestInProgress = false; if (listener != null) { listener.hideLoadingStatus(); }