Browse Source

fix and update

main
MTing 1 week ago
parent
commit
1d309e8193
  1. 233
      app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java
  2. 1
      app/src/main/java/com/ouxuan/oxface/orderOX/VerificationCodeActivity.java

233
app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java

@ -162,36 +162,36 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_oxface_online); setContentView(R.layout.activity_oxface_online);
android.util.Log.d(TAG, "onCreate方法开始执行"); android.util.Log.d(TAG, "onCreate方法开始执行");
LogManager.logInfo(TAG, "OXFaceOnlineActivity onCreate开始"); LogManager.logInfo(TAG, "OXFaceOnlineActivity onCreate开始");
mContext = this; mContext = this;
initView(); initView();
// 初始化人脸检测状态 // 初始化人脸检测状态
lastFaceDetectedTime = System.currentTimeMillis(); lastFaceDetectedTime = System.currentTimeMillis();
isFaceDetected = false; isFaceDetected = false;
consecutiveNoFaceCount = 0; consecutiveNoFaceCount = 0;
// 检查并请求相机权限 // 检查并请求相机权限
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) { != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.CAMERA},
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.CAMERA},
CAMERA_PERMISSION_REQUEST_CODE); CAMERA_PERMISSION_REQUEST_CODE);
} else { } else {
LogManager.logInfo(TAG, "相机权限已授予"); LogManager.logInfo(TAG, "相机权限已授予");
} }
// 启动内存优化周期性任务 // 启动内存优化周期性任务
startMemoryOptimizationTask(); startMemoryOptimizationTask();
// 更新小程序码 // 更新小程序码
android.util.Log.d(TAG, "准备调用updateMiniQrcode方法"); android.util.Log.d(TAG, "准备调用updateMiniQrcode方法");
updateMiniQrcode(); updateMiniQrcode();
android.util.Log.d(TAG, "updateMiniQrcode方法调用完成"); android.util.Log.d(TAG, "updateMiniQrcode方法调用完成");
LogManager.logInfo(TAG, "OXFaceOnlineActivity onCreate"); LogManager.logInfo(TAG, "OXFaceOnlineActivity onCreate");
android.util.Log.d(TAG, "onCreate方法执行结束"); android.util.Log.d(TAG, "onCreate方法执行结束");
} }
@ -235,29 +235,29 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
handleStoreNameClick(); handleStoreNameClick();
} }
}); });
// 获取并显示店铺名称 // 获取并显示店铺名称
loadAndDisplayStoreName(); loadAndDisplayStoreName();
} }
// 返回按钮隐藏但仍保留引用 // 返回按钮隐藏但仍保留引用
ImageView mButReturn = findViewById(R.id.btn_back); ImageView mButReturn = findViewById(R.id.btn_back);
if (mButReturn != null) { if (mButReturn != null) {
mButReturn.setOnClickListener(this); mButReturn.setOnClickListener(this);
} }
// 初始化二维码区域控件 // 初始化二维码区域控件
imgMiniProgramCode = findViewById(R.id.img_mini_program_code); imgMiniProgramCode = findViewById(R.id.img_mini_program_code);
imgScanDoorQRCode = findViewById(R.id.img_scan_door_qrcode); imgScanDoorQRCode = findViewById(R.id.img_scan_door_qrcode);
btnVerificationCode = findViewById(R.id.btn_verification_code); btnVerificationCode = findViewById(R.id.btn_verification_code);
btnScannerDoor = findViewById(R.id.btn_scanner_door); btnScannerDoor = findViewById(R.id.btn_scanner_door);
// 添加调试日志检查控件是否正确初始化 // 添加调试日志检查控件是否正确初始化
android.util.Log.d(TAG, "imgMiniProgramCode初始化: " + (imgMiniProgramCode != null)); android.util.Log.d(TAG, "imgMiniProgramCode初始化: " + (imgMiniProgramCode != null));
android.util.Log.d(TAG, "imgScanDoorQRCode初始化: " + (imgScanDoorQRCode != null)); android.util.Log.d(TAG, "imgScanDoorQRCode初始化: " + (imgScanDoorQRCode != null));
android.util.Log.d(TAG, "btnVerificationCode初始化: " + (btnVerificationCode != null)); android.util.Log.d(TAG, "btnVerificationCode初始化: " + (btnVerificationCode != null));
android.util.Log.d(TAG, "btnScannerDoor初始化: " + (btnScannerDoor != null)); android.util.Log.d(TAG, "btnScannerDoor初始化: " + (btnScannerDoor != null));
// 设置二维码区域控件的点击事件 // 设置二维码区域控件的点击事件
if (imgMiniProgramCode != null) { if (imgMiniProgramCode != null) {
imgMiniProgramCode.setOnClickListener(this); imgMiniProgramCode.setOnClickListener(this);
@ -271,19 +271,19 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
if (btnScannerDoor != null) { if (btnScannerDoor != null) {
btnScannerDoor.setOnClickListener(this); btnScannerDoor.setOnClickListener(this);
} }
// 底部覆盖层包含按钮和二维码 // 底部覆盖层包含按钮和二维码
RelativeLayout bottomOverlay = findViewById(R.id.bottom_overlay); RelativeLayout bottomOverlay = findViewById(R.id.bottom_overlay);
if (bottomOverlay != null) { if (bottomOverlay != null) {
// 确保底部覆盖层显示 // 确保底部覆盖层显示
bottomOverlay.setVisibility(View.VISIBLE); bottomOverlay.setVisibility(View.VISIBLE);
} }
// 初始化底部按钮 // 初始化底部按钮
btnOpenDoor = findViewById(R.id.button_open_door); btnOpenDoor = findViewById(R.id.button_open_door);
// btnScanQR = findViewById(R.id.button_scan_qr); // btnScanQR = findViewById(R.id.button_scan_qr);
// btnSettings = findViewById(R.id.button_settings); // btnSettings = findViewById(R.id.button_settings);
if (btnOpenDoor != null) { if (btnOpenDoor != null) {
btnOpenDoor.setOnClickListener(this); btnOpenDoor.setOnClickListener(this);
} }
@ -293,22 +293,22 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
// if (btnSettings != null) { // if (btnSettings != null) {
// btnSettings.setOnClickListener(this); // btnSettings.setOnClickListener(this);
// } // }
// 隐藏原有的UI元素 // 隐藏原有的UI元素
hideOriginalUI(); hideOriginalUI();
// 初始化状态信息显示 // 初始化状态信息显示
layoutCompareStatus = findViewById(R.id.layout_compare_status); layoutCompareStatus = findViewById(R.id.layout_compare_status);
if (layoutCompareStatus != null) { if (layoutCompareStatus != null) {
layoutCompareStatus.setVisibility(View.GONE); layoutCompareStatus.setVisibility(View.GONE);
} }
textCompareStatus = findViewById(R.id.text_compare_status); textCompareStatus = findViewById(R.id.text_compare_status);
// 初始化测试弹窗 // 初始化测试弹窗
initTestPopWindow(); initTestPopWindow();
android.util.Log.d(TAG, "初始化界面视图结束"); android.util.Log.d(TAG, "初始化界面视图结束");
} }
/** /**
* 隐藏原有的UI元素保持界面简洁 * 隐藏原有的UI元素保持界面简洁
*/ */
@ -322,12 +322,12 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
if (progressBarView != null) { if (progressBarView != null) {
progressBarView.setVisibility(View.GONE); progressBarView.setVisibility(View.GONE);
} }
// 隐藏提示区域 // 隐藏提示区域
if (preViewRelativeLayout != null) { if (preViewRelativeLayout != null) {
preViewRelativeLayout.setVisibility(View.GONE); preViewRelativeLayout.setVisibility(View.GONE);
} }
// 隐藏其他不需要的UI元素 // 隐藏其他不需要的UI元素
if (financeQualityTestFailed != null) { if (financeQualityTestFailed != null) {
financeQualityTestFailed.setVisibility(View.GONE); financeQualityTestFailed.setVisibility(View.GONE);
@ -345,7 +345,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
spot.setVisibility(View.GONE); spot.setVisibility(View.GONE);
} }
} }
/** /**
* 初始化测试弹窗 * 初始化测试弹窗
*/ */
@ -386,7 +386,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
// 只有在拥有相机权限时才启动预览 // 只有在拥有相机权限时才启动预览
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) { == PackageManager.PERMISSION_GRANTED) {
startTestOpenDebugRegisterFunction(); startTestOpenDebugRegisterFunction();
} }
@ -402,7 +402,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} else { } else {
CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_FACING_FRONT); CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_FACING_FRONT);
} }
CameraPreviewManager.getInstance().startPreview(mContext, mAutoCameraPreviewView, CameraPreviewManager.getInstance().startPreview(mContext, mAutoCameraPreviewView,
PREFER_WIDTH, PERFER_HEIGH, new CameraDataCallback() { PREFER_WIDTH, PERFER_HEIGH, new CameraDataCallback() {
@Override @Override
@ -413,15 +413,15 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
// 增加帧计数器和时间间隔控制 // 增加帧计数器和时间间隔控制
frameCounter++; frameCounter++;
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
// 智能调节处理频率 // 智能调节处理频率
adjustProcessFrequency(currentTime); adjustProcessFrequency(currentTime);
// 只有当满足处理条件时才进行人脸检测 // 只有当满足处理条件时才进行人脸检测
if (frameCounter % PROCESS_FRAME_INTERVAL == 0 &&
if (frameCounter % PROCESS_FRAME_INTERVAL == 0 &&
(currentTime - lastProcessTime) > MIN_PROCESS_INTERVAL) { (currentTime - lastProcessTime) > MIN_PROCESS_INTERVAL) {
lastProcessTime = currentTime; lastProcessTime = currentTime;
// 检查应用是否处于前台 // 检查应用是否处于前台
if (!isApplicationInForeground()) { if (!isApplicationInForeground()) {
// 如果应用在后台减少处理频率每隔10秒处理一次 // 如果应用在后台减少处理频率每隔10秒处理一次
@ -430,7 +430,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} }
lastBackgroundProcessTime = currentTime; lastBackgroundProcessTime = currentTime;
} }
FaceSDKManager.getInstance().onDetectCheck(data, null, null, FaceSDKManager.getInstance().onDetectCheck(data, null, null,
height, width, 1, new FaceDetectCallBack() { height, width, 1, new FaceDetectCallBack() {
@Override @Override
@ -438,7 +438,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
try { try {
// 更新人脸检测状态 // 更新人脸检测状态
updateFaceDetectionStatus(livenessModel); updateFaceDetectionStatus(livenessModel);
// 开发模式结果输出 // 开发模式结果输出
checkOpenDebugResult(livenessModel); checkOpenDebugResult(livenessModel);
} catch (Exception e) { } catch (Exception e) {
@ -477,6 +477,8 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
LogManager.logError(TAG, "清空画布时发生异常", e); LogManager.logError(TAG, "清空画布时发生异常", e);
} }
} }
}else{
android.util.Log.d("OXFace", "isNeedCamera: false");
} }
} catch (Exception e) { } catch (Exception e) {
LogManager.logError(TAG, "摄像头数据处理异常", e); LogManager.logError(TAG, "摄像头数据处理异常", e);
@ -497,7 +499,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
}, 5000); // 5秒后重试 }, 5000); // 5秒后重试
} }
} }
/** /**
* 智能调节处理频率 * 智能调节处理频率
* @param currentTime 当前时间 * @param currentTime 当前时间
@ -505,17 +507,17 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
private void adjustProcessFrequency(long currentTime) { private void adjustProcessFrequency(long currentTime) {
// 如果检测到人脸加速处理 // 如果检测到人脸加速处理
if (isFaceDetected) { if (isFaceDetected) {
if (PROCESS_FRAME_INTERVAL != FAST_PROCESS_FRAME_INTERVAL ||
if (PROCESS_FRAME_INTERVAL != FAST_PROCESS_FRAME_INTERVAL ||
MIN_PROCESS_INTERVAL != FAST_MIN_PROCESS_INTERVAL) { MIN_PROCESS_INTERVAL != FAST_MIN_PROCESS_INTERVAL) {
PROCESS_FRAME_INTERVAL = FAST_PROCESS_FRAME_INTERVAL; PROCESS_FRAME_INTERVAL = FAST_PROCESS_FRAME_INTERVAL;
MIN_PROCESS_INTERVAL = FAST_MIN_PROCESS_INTERVAL; MIN_PROCESS_INTERVAL = FAST_MIN_PROCESS_INTERVAL;
LogManager.logInfo(TAG, "检测到人脸,加速处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms"); LogManager.logInfo(TAG, "检测到人脸,加速处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms");
} }
}
}
// 如果长时间未检测到人脸降低处理频率以节省资源 // 如果长时间未检测到人脸降低处理频率以节省资源
else if (currentTime - lastFaceDetectedTime > FACE_DETECTION_TIMEOUT) { else if (currentTime - lastFaceDetectedTime > FACE_DETECTION_TIMEOUT) {
// 检查是否已经处于慢速处理模式 // 检查是否已经处于慢速处理模式
if (PROCESS_FRAME_INTERVAL != SLOW_PROCESS_FRAME_INTERVAL ||
if (PROCESS_FRAME_INTERVAL != SLOW_PROCESS_FRAME_INTERVAL ||
MIN_PROCESS_INTERVAL != SLOW_MIN_PROCESS_INTERVAL) { MIN_PROCESS_INTERVAL != SLOW_MIN_PROCESS_INTERVAL) {
PROCESS_FRAME_INTERVAL = SLOW_PROCESS_FRAME_INTERVAL; PROCESS_FRAME_INTERVAL = SLOW_PROCESS_FRAME_INTERVAL;
MIN_PROCESS_INTERVAL = SLOW_MIN_PROCESS_INTERVAL; MIN_PROCESS_INTERVAL = SLOW_MIN_PROCESS_INTERVAL;
@ -523,30 +525,30 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} }
} }
} }
/** /**
* 更新人脸检测状态 * 更新人脸检测状态
* @param livenessModel 活体检测模型 * @param livenessModel 活体检测模型
*/ */
private void updateFaceDetectionStatus(LivenessModel livenessModel) { private void updateFaceDetectionStatus(LivenessModel livenessModel) {
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
// 检查是否检测到人脸 // 检查是否检测到人脸
boolean faceDetected = (livenessModel != null &&
livenessModel.getTrackFaceInfo() != null &&
boolean faceDetected = (livenessModel != null &&
livenessModel.getTrackFaceInfo() != null &&
livenessModel.getTrackFaceInfo().length > 0); livenessModel.getTrackFaceInfo().length > 0);
if (faceDetected) { if (faceDetected) {
// 检测到人脸 // 检测到人脸
isFaceDetected = true; isFaceDetected = true;
lastFaceDetectedTime = currentTime; lastFaceDetectedTime = currentTime;
consecutiveNoFaceCount = 0; // 重置连续未检测到人脸计数器 consecutiveNoFaceCount = 0; // 重置连续未检测到人脸计数器
LogManager.logDebug(TAG, "检测到人脸"); LogManager.logDebug(TAG, "检测到人脸");
} else { } else {
// 未检测到人脸 // 未检测到人脸
consecutiveNoFaceCount++; consecutiveNoFaceCount++;
// 如果连续多次未检测到人脸标记为未检测到人脸状态 // 如果连续多次未检测到人脸标记为未检测到人脸状态
if (consecutiveNoFaceCount >= CONSECUTIVE_NO_FACE_THRESHOLD) { if (consecutiveNoFaceCount >= CONSECUTIVE_NO_FACE_THRESHOLD) {
isFaceDetected = false; isFaceDetected = false;
@ -566,29 +568,29 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
if (canvas == null) { if (canvas == null) {
return; return;
} }
// 始终清空canvas // 始终清空canvas
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
// 如果没有模型数据直接返回清空的画布 // 如果没有模型数据直接返回清空的画布
if (model == null) { if (model == null) {
mDrawDetectFaceView.unlockCanvasAndPost(canvas); mDrawDetectFaceView.unlockCanvasAndPost(canvas);
return; return;
} }
// 获取人脸信息 // 获取人脸信息
FaceInfo[] faceInfos = model.getTrackFaceInfo(); FaceInfo[] faceInfos = model.getTrackFaceInfo();
// 如果没有检测到人脸直接返回清空的画布 // 如果没有检测到人脸直接返回清空的画布
if (faceInfos == null || faceInfos.length == 0) { if (faceInfos == null || faceInfos.length == 0) {
mDrawDetectFaceView.unlockCanvasAndPost(canvas); mDrawDetectFaceView.unlockCanvasAndPost(canvas);
return; return;
} }
// 只在检测到人脸时绘制人脸框 // 只在检测到人脸时绘制人脸框
for (int i = 0; i < faceInfos.length; i++) { for (int i = 0; i < faceInfos.length; i++) {
FaceInfo faceInfo = faceInfos[i]; FaceInfo faceInfo = faceInfos[i];
// 如果人脸置信度太低不绘制 // 如果人脸置信度太低不绘制
if (faceInfo.score < 0.6) { if (faceInfo.score < 0.6) {
continue; continue;
@ -604,7 +606,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
FaceOnDrawTexturViewUtil.drawRect(canvas, FaceOnDrawTexturViewUtil.drawRect(canvas,
rectF, paint, 5f, 50f, 25f); rectF, paint, 5f, 50f, 25f);
} }
// 提交canvas // 提交canvas
mDrawDetectFaceView.unlockCanvasAndPost(canvas); mDrawDetectFaceView.unlockCanvasAndPost(canvas);
} }
@ -619,7 +621,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} else if (id == R.id.button_open_door) { } else if (id == R.id.button_open_door) {
// 开门按钮点击事件 // 开门按钮点击事件
handleOpenDoorClick(); handleOpenDoorClick();
}
}
// else if (id == R.id.button_scan_qr) { // else if (id == R.id.button_scan_qr) {
// // 扫码按钮点击事件 // // 扫码按钮点击事件
// handleScanQRClick(); // handleScanQRClick();
@ -648,17 +650,17 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
private void handleOpenDoorClick() { private void handleOpenDoorClick() {
LogManager.logInfo(TAG, "用户点击开门按钮"); LogManager.logInfo(TAG, "用户点击开门按钮");
Toast.makeText(this, "开门功能已触发", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "开门功能已触发", Toast.LENGTH_SHORT).show();
// 这里可以添加实际的开门逻辑 // 这里可以添加实际的开门逻辑
// 例如发送网络请求到服务器执行开门操作 // 例如发送网络请求到服务器执行开门操作
// 或者通过蓝牙/WiFi连接门锁设备 // 或者通过蓝牙/WiFi连接门锁设备
// 显示开门状态 // 显示开门状态
if (layoutCompareStatus != null) { if (layoutCompareStatus != null) {
layoutCompareStatus.setVisibility(View.VISIBLE); layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#009874")); textCompareStatus.setTextColor(Color.parseColor("#009874"));
textCompareStatus.setText("正在开门..."); textCompareStatus.setText("正在开门...");
// 3秒后隐藏状态提示 // 3秒后隐藏状态提示
new Handler().postDelayed(new Runnable() { new Handler().postDelayed(new Runnable() {
@Override @Override
@ -677,16 +679,16 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
private void handleScanQRClick() { private void handleScanQRClick() {
LogManager.logInfo(TAG, "用户点击扫码按钮"); LogManager.logInfo(TAG, "用户点击扫码按钮");
Toast.makeText(this, "扫码功能已触发", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "扫码功能已触发", Toast.LENGTH_SHORT).show();
// 这里可以添加实际的扫码逻辑 // 这里可以添加实际的扫码逻辑
// 例如启动扫码Activity或显示扫码界面 // 例如启动扫码Activity或显示扫码界面
// 显示扫码状态 // 显示扫码状态
if (layoutCompareStatus != null) { if (layoutCompareStatus != null) {
layoutCompareStatus.setVisibility(View.VISIBLE); layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#009874")); textCompareStatus.setTextColor(Color.parseColor("#009874"));
textCompareStatus.setText("请将二维码对准扫描区域"); textCompareStatus.setText("请将二维码对准扫描区域");
// 3秒后隐藏状态提示 // 3秒后隐藏状态提示
new Handler().postDelayed(new Runnable() { new Handler().postDelayed(new Runnable() {
@Override @Override
@ -705,16 +707,16 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
private void handleSettingsClick() { private void handleSettingsClick() {
LogManager.logInfo(TAG, "用户点击设置按钮"); LogManager.logInfo(TAG, "用户点击设置按钮");
Toast.makeText(this, "设置功能已触发", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "设置功能已触发", Toast.LENGTH_SHORT).show();
// 这里可以添加实际的设置逻辑 // 这里可以添加实际的设置逻辑
// 例如启动设置Activity或显示设置对话框 // 例如启动设置Activity或显示设置对话框
// 显示设置状态 // 显示设置状态
if (layoutCompareStatus != null) { if (layoutCompareStatus != null) {
layoutCompareStatus.setVisibility(View.VISIBLE); layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#009874")); textCompareStatus.setTextColor(Color.parseColor("#009874"));
textCompareStatus.setText("正在加载设置..."); textCompareStatus.setText("正在加载设置...");
// 3秒后隐藏状态提示 // 3秒后隐藏状态提示
new Handler().postDelayed(new Runnable() { new Handler().postDelayed(new Runnable() {
@Override @Override
@ -726,7 +728,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
}, 3000); }, 3000);
} }
} }
/** /**
* 处理新用户扫码上传人脸点击事件 * 处理新用户扫码上传人脸点击事件
*/ */
@ -788,7 +790,11 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
*/ */
private void handleVerificationCodeClick() { private void handleVerificationCodeClick() {
LogManager.logInfo(TAG, "用户点击验证码开门"); LogManager.logInfo(TAG, "用户点击验证码开门");
// 暂停摄像头预览
isNeedCamera = false;
LogManager.logInfo(TAG, "暂停摄像头预览 - isNeedCamera设置为false");
// 启动验证码Activity // 启动验证码Activity
Intent intent = new Intent(this, VerificationCodeActivity.class); Intent intent = new Intent(this, VerificationCodeActivity.class);
startActivityForResult(intent, 1001); startActivityForResult(intent, 1001);
@ -840,12 +846,12 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
// 停止摄像头预览 // 停止摄像头预览
if (CameraPreviewManager.getInstance() != null) { if (CameraPreviewManager.getInstance() != null) {
CameraPreviewManager.getInstance().stopPreview(); CameraPreviewManager.getInstance().stopPreview();
} }
// 释放当前的LivenessModel资源 // 释放当前的LivenessModel资源
if (currentLivenessModel != null) { if (currentLivenessModel != null) {
BDFaceImageInstance image = currentLivenessModel.getBdFaceImageInstance(); BDFaceImageInstance image = currentLivenessModel.getBdFaceImageInstance();
@ -855,7 +861,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
// 清空引用 // 清空引用
currentLivenessModel = null; currentLivenessModel = null;
} }
// 释放绘图资源 // 释放绘图资源
if (rectF != null) { if (rectF != null) {
rectF = null; rectF = null;
@ -866,34 +872,34 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
if (paintBg != null) { if (paintBg != null) {
paintBg = null; paintBg = null;
} }
// 清除其他相关资源 // 清除其他相关资源
System.gc(); System.gc();
LogManager.logInfo(TAG, "OXFaceOnlineActivity onDestroy - 资源已释放"); LogManager.logInfo(TAG, "OXFaceOnlineActivity onDestroy - 资源已释放");
} }
@Override @Override
protected void onStop() { protected void onStop() {
super.onStop(); super.onStop();
LogManager.logInfo(TAG, "OXFaceOnlineActivity onStop - 应用进入后台"); LogManager.logInfo(TAG, "OXFaceOnlineActivity onStop - 应用进入后台");
// 应用进入后台时进一步降低处理频率以节省资源 // 应用进入后台时进一步降低处理频率以节省资源
PROCESS_FRAME_INTERVAL = 30; // 后台时每30帧处理一次 PROCESS_FRAME_INTERVAL = 30; // 后台时每30帧处理一次
MIN_PROCESS_INTERVAL = 3000; // 后台时最小间隔3秒 MIN_PROCESS_INTERVAL = 3000; // 后台时最小间隔3秒
LogManager.logInfo(TAG, "后台模式处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms"); LogManager.logInfo(TAG, "后台模式处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms");
} }
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
LogManager.logInfo(TAG, "OXFaceOnlineActivity onStart - 应用回到前台"); LogManager.logInfo(TAG, "OXFaceOnlineActivity onStart - 应用回到前台");
// 应用回到前台时恢复正常的处理频率 // 应用回到前台时恢复正常的处理频率
PROCESS_FRAME_INTERVAL = FAST_PROCESS_FRAME_INTERVAL; // 前台时使用快速处理频率 PROCESS_FRAME_INTERVAL = FAST_PROCESS_FRAME_INTERVAL; // 前台时使用快速处理频率
MIN_PROCESS_INTERVAL = FAST_MIN_PROCESS_INTERVAL; // 前台时使用快速处理间隔 MIN_PROCESS_INTERVAL = FAST_MIN_PROCESS_INTERVAL; // 前台时使用快速处理间隔
LogManager.logInfo(TAG, "前台模式处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms"); LogManager.logInfo(TAG, "前台模式处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms");
} }
@ -988,19 +994,19 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
if (livenessModel == null) { if (livenessModel == null) {
return; return;
} }
// 减少base64转换频率只有在特定条件下才进行转换 // 减少base64转换频率只有在特定条件下才进行转换
// 例如每3秒检查一次是否需要发送人脸图像 // 例如每3秒检查一次是否需要发送人脸图像
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
if (currentTime - searshTime > 3000) { if (currentTime - searshTime > 3000) {
searshTime = currentTime; searshTime = currentTime;
needSendFaceImage = true; needSendFaceImage = true;
String base64img = getFaceImageBase64(currentLivenessModel); String base64img = getFaceImageBase64(currentLivenessModel);
if (base64img != null) { if (base64img != null) {
// 这里可以处理base64数据如上传到服务器等 // 这里可以处理base64数据如上传到服务器等
Log.i(TAG, "checkResultOnline: 获取到人脸base64数据"); Log.i(TAG, "checkResultOnline: 获取到人脸base64数据");
// 处理完成后重置标志 // 处理完成后重置标志
needSendFaceImage = false; needSendFaceImage = false;
} else { } else {
@ -1023,7 +1029,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
BDFaceImageInstance image = livenessModel.getBdFaceImageInstance(); BDFaceImageInstance image = livenessModel.getBdFaceImageInstance();
if (image != null) { if (image != null) {
Bitmap bitmap = BitmapUtils.getInstaceBmp(image); Bitmap bitmap = BitmapUtils.getInstaceBmp(image);
// 仅在确实需要使用base64数据时才进行转换 // 仅在确实需要使用base64数据时才进行转换
if (needSendFaceImage) { if (needSendFaceImage) {
String bitmap_str = BitmapUtils.bitmapToBase64(bitmap); String bitmap_str = BitmapUtils.bitmapToBase64(bitmap);
@ -1041,7 +1047,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} }
return null; return null;
} }
/** /**
* 检查应用是否在前台 * 检查应用是否在前台
* @return 如果应用在前台则返回true否则返回false * @return 如果应用在前台则返回true否则返回false
@ -1052,7 +1058,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
if (appProcesses == null) { if (appProcesses == null) {
return false; return false;
} }
String packageName = getPackageName(); String packageName = getPackageName();
for (android.app.ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { for (android.app.ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND if (appProcess.importance == android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
@ -1062,7 +1068,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} }
return false; return false;
} }
/** /**
* 低内存时的处理 * 低内存时的处理
*/ */
@ -1070,14 +1076,14 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
public void onLowMemory() { public void onLowMemory() {
super.onLowMemory(); super.onLowMemory();
LogManager.logInfo(TAG, "系统内存不足,触发onLowMemory"); LogManager.logInfo(TAG, "系统内存不足,触发onLowMemory");
// 清理不必要的缓存 // 清理不必要的缓存
clearMemoryCache(); clearMemoryCache();
// 强制GC // 强制GC
System.gc(); System.gc();
} }
/** /**
* 清理内存缓存 * 清理内存缓存
*/ */
@ -1090,14 +1096,14 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} }
currentLivenessModel = null; currentLivenessModel = null;
} }
// 如果设备内存不足考虑调整处理频率 // 如果设备内存不足考虑调整处理频率
PROCESS_FRAME_INTERVAL = Math.min(30, PROCESS_FRAME_INTERVAL + 5); PROCESS_FRAME_INTERVAL = Math.min(30, PROCESS_FRAME_INTERVAL + 5);
MIN_PROCESS_INTERVAL = Math.min(3000, MIN_PROCESS_INTERVAL + 500); MIN_PROCESS_INTERVAL = Math.min(3000, MIN_PROCESS_INTERVAL + 500);
LogManager.logInfo(TAG, "内存不足,调整处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms"); LogManager.logInfo(TAG, "内存不足,调整处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms");
} }
/** /**
* 优化内存的周期性任务 * 优化内存的周期性任务
*/ */
@ -1110,24 +1116,24 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
long usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024); long usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024);
long totalMemory = runtime.maxMemory() / (1024 * 1024); long totalMemory = runtime.maxMemory() / (1024 * 1024);
float memoryUsageRatio = (float) usedMemory / totalMemory; float memoryUsageRatio = (float) usedMemory / totalMemory;
LogManager.logInfo(TAG, "内存使用情况:" + usedMemory + "MB/" + totalMemory +
LogManager.logInfo(TAG, "内存使用情况:" + usedMemory + "MB/" + totalMemory +
"MB,使用率:" + (int)(memoryUsageRatio * 100) + "%"); "MB,使用率:" + (int)(memoryUsageRatio * 100) + "%");
// 如果内存使用率超过70%主动清理内存 // 如果内存使用率超过70%主动清理内存
if (memoryUsageRatio > 0.7f) { if (memoryUsageRatio > 0.7f) {
LogManager.logInfo(TAG, "内存使用率超过70%,主动清理内存"); LogManager.logInfo(TAG, "内存使用率超过70%,主动清理内存");
clearMemoryCache(); clearMemoryCache();
System.gc(); System.gc();
} }
// 如果内存使用率超过85%进行更积极的清理 // 如果内存使用率超过85%进行更积极的清理
if (memoryUsageRatio > 0.85f) { if (memoryUsageRatio > 0.85f) {
LogManager.logWarning(TAG, "内存使用率超过85%,进行积极清理"); LogManager.logWarning(TAG, "内存使用率超过85%,进行积极清理");
// 进一步降低处理频率 // 进一步降低处理频率
PROCESS_FRAME_INTERVAL = Math.min(50, PROCESS_FRAME_INTERVAL + 10); PROCESS_FRAME_INTERVAL = Math.min(50, PROCESS_FRAME_INTERVAL + 10);
MIN_PROCESS_INTERVAL = Math.min(5000, MIN_PROCESS_INTERVAL + 1000); MIN_PROCESS_INTERVAL = Math.min(5000, MIN_PROCESS_INTERVAL + 1000);
// 清理更多资源 // 清理更多资源
if (currentLivenessModel != null) { if (currentLivenessModel != null) {
BDFaceImageInstance image = currentLivenessModel.getBdFaceImageInstance(); BDFaceImageInstance image = currentLivenessModel.getBdFaceImageInstance();
@ -1136,11 +1142,11 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} }
currentLivenessModel = null; currentLivenessModel = null;
} }
LogManager.logInfo(TAG, "积极清理后调整处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms"); LogManager.logInfo(TAG, "积极清理后调整处理频率:每" + PROCESS_FRAME_INTERVAL + "帧,最小间隔" + MIN_PROCESS_INTERVAL + "ms");
System.gc(); System.gc();
} }
// 每30秒执行一次 // 每30秒执行一次
if (!isFinishing()) { if (!isFinishing()) {
new Handler().postDelayed(this, 30000); new Handler().postDelayed(this, 30000);
@ -1148,7 +1154,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} }
}, 30000); }, 30000);
} }
/** /**
* 更新小程序码显示 * 更新小程序码显示
*/ */
@ -1156,7 +1162,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
LogManager.logInfo(TAG, "开始更新小程序码"); LogManager.logInfo(TAG, "开始更新小程序码");
try { try {
DeviceSelectDataManager deviceSelectDataManager = DeviceSelectDataManager.getInstance(this); DeviceSelectDataManager deviceSelectDataManager = DeviceSelectDataManager.getInstance(this);
// 更新普通小程序码扫码开门 // 更新普通小程序码扫码开门
boolean hasQrcode = deviceSelectDataManager.hasMiniQrcodeUrl(); boolean hasQrcode = deviceSelectDataManager.hasMiniQrcodeUrl();
if (hasQrcode) { if (hasQrcode) {
@ -1175,7 +1181,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
decodedBase64 = base64Qrcode.substring(commaIndex + 1); decodedBase64 = base64Qrcode.substring(commaIndex + 1);
} }
} }
Bitmap qrcodeBitmap = BitmapUtils.base64ToBitmap(decodedBase64); Bitmap qrcodeBitmap = BitmapUtils.base64ToBitmap(decodedBase64);
if (qrcodeBitmap != null && imgScanDoorQRCode != null) { if (qrcodeBitmap != null && imgScanDoorQRCode != null) {
imgScanDoorQRCode.setImageBitmap(qrcodeBitmap); imgScanDoorQRCode.setImageBitmap(qrcodeBitmap);
@ -1194,7 +1200,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
} else { } else {
LogManager.logDebug(TAG, "未找到扫码开门小程序码链接"); LogManager.logDebug(TAG, "未找到扫码开门小程序码链接");
} }
// 更新上传人脸小程序码 // 更新上传人脸小程序码
boolean hasUploadFaceQrcode = deviceSelectDataManager.hasUploadFaceMiniQrcodeUrl(); boolean hasUploadFaceQrcode = deviceSelectDataManager.hasUploadFaceMiniQrcodeUrl();
if (hasUploadFaceQrcode) { if (hasUploadFaceQrcode) {
@ -1229,7 +1235,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
LogManager.logError(TAG, "获取小程序码异常: " + e.getMessage(), e); LogManager.logError(TAG, "获取小程序码异常: " + e.getMessage(), e);
} }
} }
/** /**
* 获取并显示店铺名称 * 获取并显示店铺名称
*/ */
@ -1238,7 +1244,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
DeviceSelectDataManager deviceDataManager = DeviceSelectDataManager.getInstance(this); DeviceSelectDataManager deviceDataManager = DeviceSelectDataManager.getInstance(this);
String[] storeInfo = deviceDataManager.getStoreInfo(); String[] storeInfo = deviceDataManager.getStoreInfo();
String storeName = storeInfo[0]; // 第一个元素是店铺名称 String storeName = storeInfo[0]; // 第一个元素是店铺名称
if (storeName != null && !storeName.isEmpty()) { if (storeName != null && !storeName.isEmpty()) {
tvStoreName.setText(storeName); tvStoreName.setText(storeName);
LogManager.logInfo(TAG, "成功显示店铺名称: " + storeName); LogManager.logInfo(TAG, "成功显示店铺名称: " + storeName);
@ -1251,31 +1257,31 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
LogManager.logError(TAG, "获取店铺名称失败", e); LogManager.logError(TAG, "获取店铺名称失败", e);
} }
} }
/** /**
* 处理店铺名称点击事件 * 处理店铺名称点击事件
*/ */
private void handleStoreNameClick() { private void handleStoreNameClick() {
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
// 如果距离上次点击时间超过1秒重置计数器 // 如果距离上次点击时间超过1秒重置计数器
if (currentTime - lastStoreNameClickTime > CLICK_INTERVAL) { if (currentTime - lastStoreNameClickTime > CLICK_INTERVAL) {
storeNameClickCount = 0; storeNameClickCount = 0;
} }
storeNameClickCount++; storeNameClickCount++;
lastStoreNameClickTime = currentTime; lastStoreNameClickTime = currentTime;
LogManager.logDebug(TAG, "店铺名称被点击,当前计数: " + storeNameClickCount); LogManager.logDebug(TAG, "店铺名称被点击,当前计数: " + storeNameClickCount);
// 如果连续点击达到5次 // 如果连续点击达到5次
if (storeNameClickCount >= MAX_CLICK_COUNT) { if (storeNameClickCount >= MAX_CLICK_COUNT) {
LogManager.logInfo(TAG, "连续点击5次店铺名称,准备返回主界面"); LogManager.logInfo(TAG, "连续点击5次店铺名称,准备返回主界面");
Toast.makeText(this, "即将返回主界面", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "即将返回主界面", Toast.LENGTH_SHORT).show();
// 重置计数器 // 重置计数器
storeNameClickCount = 0; storeNameClickCount = 0;
// 延迟一段时间后返回主界面 // 延迟一段时间后返回主界面
new Handler().postDelayed(new Runnable() { new Handler().postDelayed(new Runnable() {
@Override @Override
@ -1289,7 +1295,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
Toast.makeText(this, "再点击" + remainingClicks + "次返回主界面", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "再点击" + remainingClicks + "次返回主界面", Toast.LENGTH_SHORT).show();
} }
} }
/** /**
* 返回主界面 * 返回主界面
*/ */
@ -1300,7 +1306,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
startActivity(intent); startActivity(intent);
finish(); finish();
} }
/** /**
* 处理验证码Activity返回结果 * 处理验证码Activity返回结果
*/ */
@ -1308,13 +1314,22 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1001) {
if (requestCode == 1001) { // 验证码验证获取输入结果
// 恢复摄像头预览
isNeedCamera = true;
LogManager.logInfo(TAG, "恢复摄像头预览 - isNeedCamera设置为true");
if (resultCode == RESULT_OK && data != null) { if (resultCode == RESULT_OK && data != null) {
String verificationCode = data.getStringExtra("verification_code"); String verificationCode = data.getStringExtra("verification_code");
if (verificationCode != null && verificationCode.length() == 12) { if (verificationCode != null && verificationCode.length() == 12) {
LogManager.logInfo(TAG, "收到验证码: " + verificationCode); LogManager.logInfo(TAG, "收到验证码: " + verificationCode);
android.util.Log.d("MainActivity", "收到验证码"+verificationCode);
handleVerificationCodeSubmit(verificationCode); handleVerificationCodeSubmit(verificationCode);
} }
} else if (resultCode == RESULT_CANCELED) {
LogManager.logInfo(TAG, "用户点击关闭验证码弹窗");
} else { } else {
LogManager.logInfo(TAG, "用户取消验证码输入"); LogManager.logInfo(TAG, "用户取消验证码输入");
} }

1
app/src/main/java/com/ouxuan/oxface/orderOX/VerificationCodeActivity.java

@ -177,6 +177,7 @@ public class VerificationCodeActivity extends AppCompatActivity {
String code = verificationCode.toString(); String code = verificationCode.toString();
LogManager.logInfo(TAG, "用户输入验证码: " + code); LogManager.logInfo(TAG, "用户输入验证码: " + code);
android.util.Log.d(TAG, "用户输入验证码: " + code);
// 验证验证码格式 // 验证验证码格式
if (code.length() != 12 || !code.matches("\\d{12}")) { if (code.length() != 12 || !code.matches("\\d{12}")) {

Loading…
Cancel
Save