|
@ -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, "用户取消验证码输入"); |
|
|
} |
|
|
} |
|
|