package com.ouxuan.oxface; import android.app.Activity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; // 恢复原来的导入 //import com.baidu.idl.face.main.finance.manager.FaceSDKManager; import com.baidu.idl.face.main.finance.listener.SdkInitListener; import com.baidu.idl.face.main.finance.manager.FaceSDKManager; import com.ouxuan.oxface.device.DeviceUtils; import com.ouxuan.oxface.device.GateABController; import com.ouxuan.oxface.device.HuaWeiScanManager; import com.ouxuan.oxface.device.Ox485; import com.ouxuan.oxface.device.RelayController; import com.ouxuan.oxface.network.utils.NetworkUtils; import com.ouxuan.oxface.utils.AutoStartManager; import com.ouxuan.oxface.utils.BootSimulationHelper; import com.ouxuan.oxface.utils.LogManager; import com.ouxuan.oxface.utils.UtilCodeHelper; import com.ouxuan.oxface.utils.VenueSceneUtils; import java.io.File; import java.util.Date; public class DebugActivity extends Activity { private static final String TAG = "DebugActivity"; private TextView tvLogOutput; private ScrollView logScrollView; private AutoStartManager autoStartManager; private RelayController relayController; private Ox485 ox485; private GateABController gateABController; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_debug); initViews(); initManagers(); setupClickListeners(); } private void initViews() { tvLogOutput = findViewById(R.id.tvLogOutput); logScrollView = findViewById(R.id.logScrollView); // 初始化日志显示 tvLogOutput.setText("调试界面已启动 - " + new Date().toString() + "\n"); } private void initManagers() { autoStartManager = AutoStartManager.getInstance(this); relayController = RelayController.getInstance(); ox485 = Ox485.getInstance(); ox485.initialize(this); gateABController = GateABController.getInstance(); gateABController.initialize(this); } private void setupClickListeners() { // 测试自启动按钮 Button btnTestAutoStart = findViewById(R.id.btnTestAutoStart); btnTestAutoStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { logMessage("触发自启动测试..."); triggerAutoStartTest(); } }); // 测试直接启动按钮 Button btnTestDirectStart = findViewById(R.id.btnTestDirectStart); btnTestDirectStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { logMessage("触发直接启动测试..."); triggerDirectStartTest(); } }); // 显示日志路径按钮 Button btnShowLogPath = findViewById(R.id.btnShowLogPath); btnShowLogPath.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showLogPathInfo(); } }); // 写入测试日志按钮 Button btnWriteTestLog = findViewById(R.id.btnWriteTestLog); btnWriteTestLog.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { writeTestLogs(); } }); // 显示自启动状态按钮 Button btnShowAutoStartStatus = findViewById(R.id.btnShowAutoStartStatus); btnShowAutoStartStatus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showAutoStartStatus(); } }); // 重置统计信息按钮 Button btnResetAutoStartStats = findViewById(R.id.btnResetAutoStartStats); btnResetAutoStartStats.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { resetAutoStartStats(); } }); // 显示设备信息按钮 Button btnShowDeviceInfo = findViewById(R.id.btnShowDeviceInfo); btnShowDeviceInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showDeviceInfo(); } }); // 测试网络连接按钮 Button btnTestNetwork = findViewById(R.id.btnTestNetwork); btnTestNetwork.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { testNetworkConnection(); } }); // 清空日志按钮 Button btnClearLogs = findViewById(R.id.btnClearLogs); btnClearLogs.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { clearLogs(); } }); // 测试Shell命令按钮 Button btnTestShellCommand = findViewById(R.id.btnTestShellCommand); btnTestShellCommand.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { testShellCommand(); } }); // 测试闹钟按钮 Button btnTestAlarm = findViewById(R.id.btnTestAlarm); btnTestAlarm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { testAlarm(); } }); // 初始化人脸SDK按钮 Button btnInitFaceSDK = findViewById(R.id.btnInitFaceSDK); btnInitFaceSDK.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { initFaceSDK(); } }); // 人脸识别测试按钮 Button btnFaceRecognitionTest = findViewById(R.id.btnFaceRecognitionTest); btnFaceRecognitionTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startFaceRecognitionTest(); } }); // 关闭按钮 Button btnClose = findViewById(R.id.btnClose); btnClose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); // 查验设备配置按钮 Button btnCheckDeviceConfig = findViewById(R.id.btnCheckDeviceConfig); btnCheckDeviceConfig.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { checkDeviceConfig(); } }); // 华为扫码测试按钮 Button btnTestHuaWeiScan = findViewById(R.id.btnTestHuaWeiScan); btnTestHuaWeiScan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { testHuaWeiScan(); } }); // 继电器开启测试按钮 Button btnTestRelayOpen = findViewById(R.id.btnTestRelayOpen); btnTestRelayOpen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { testRelayOpen(); } }); // 继电器关闭测试按钮 Button btnTestRelayClose = findViewById(R.id.btnTestRelayClose); btnTestRelayClose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { testRelayClose(); } }); // 继电器自动关闭测试按钮 Button btnTestRelayAutoClose = findViewById(R.id.btnTestRelayAutoClose); btnTestRelayAutoClose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { testRelayAutoClose(); } }); // 485人数测试按钮 Button btnTest485PeopleNum = findViewById(R.id.btnTest485PeopleNum); btnTest485PeopleNum.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { test485PeopleNum(); } }); // AB门485测试按钮 Button btnTestGateAB485 = findViewById(R.id.btnTestGateAB485); btnTestGateAB485.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { testGateAB485PeopleNum(); } }); } /** * 测试继电器开启 */ private void testRelayOpen() { logMessage("触发继电器开启测试..."); try { boolean success = relayController.openRelay(); if (success) { logMessage("继电器开启成功"); showToast("继电器开启成功"); } else { logMessage("继电器开启失败"); showToast("继电器开启失败"); } } catch (Exception e) { Log.e(TAG, "继电器开启测试失败", e); logMessage("继电器开启测试失败: " + e.getMessage()); showToast("继电器开启测试失败"); } } /** * 测试继电器关闭 */ private void testRelayClose() { logMessage("触发继电器关闭测试..."); try { boolean success = relayController.closeRelay(); if (success) { logMessage("继电器关闭成功"); showToast("继电器关闭成功"); } else { logMessage("继电器关闭失败"); showToast("继电器关闭失败"); } } catch (Exception e) { Log.e(TAG, "继电器关闭测试失败", e); logMessage("继电器关闭测试失败: " + e.getMessage()); showToast("继电器关闭测试失败"); } } /** * 测试继电器自动关闭功能 */ private void testRelayAutoClose() { logMessage("触发继电器自动关闭测试..."); try { boolean success = relayController.openRelayWithAutoClose(); if (success) { logMessage("继电器已开启,将在3秒后自动关闭"); showToast("继电器已开启,将在3秒后自动关闭"); } else { logMessage("继电器自动关闭测试失败"); showToast("继电器自动关闭测试失败"); } } catch (Exception e) { Log.e(TAG, "继电器自动关闭测试失败", e); logMessage("继电器自动关闭测试失败: " + e.getMessage()); showToast("继电器自动关闭测试失败"); } } /** * 查验设备配置 */ private void checkDeviceConfig() { logMessage("开始查验设备配置..."); try { String padSettingJson = com.ouxuan.oxface.utils.VenueSceneUtils.getPadSettingJson(this); if (!padSettingJson.isEmpty()) { logMessage("设备配置查验成功:\n" + padSettingJson); showToast("设备配置查验成功"); } else { logMessage("设备配置查验失败: 未获取到配置数据"); showToast("设备配置查验失败"); } } catch (Exception e) { Log.e(TAG, "查验设备配置时发生异常", e); logMessage("查验设备配置时发生异常: " + e.getMessage()); showToast("查验设备配置时发生异常"); } } /** * 触发自启动测试 */ private void triggerAutoStartTest() { try { BootSimulationHelper.simulateBootCompleted(this); logMessage("自启动测试已触发"); showToast("自启动测试已触发"); } catch (Exception e) { Log.e(TAG, "触发自启动测试失败", e); logMessage("触发自启动测试失败: " + e.getMessage()); showToast("触发自启动测试失败"); } } /** * 直接启动应用测试 */ private void triggerDirectStartTest() { try { BootSimulationHelper.directStartApp(this); logMessage("直接启动测试已触发"); showToast("直接启动测试已触发"); } catch (Exception e) { Log.e(TAG, "触发直接启动测试失败", e); logMessage("触发直接启动测试失败: " + e.getMessage()); showToast("触发直接启动测试失败"); } } /** * 显示日志路径信息 */ private void showLogPathInfo() { String pathInfo = LogManager.getLogPathInfo(this); logMessage("日志路径信息:\n" + pathInfo); // 写入一条测试日志 LogManager.logOperation("调试", "用户查看日志路径信息"); // 复制日志目录路径到剪贴板 ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); if (clipboard != null) { LogManager logManager = LogManager.getInstance(this); String logDirPath = logManager.getLogDirectory().getAbsolutePath(); ClipData clip = ClipData.newPlainText("日志目录路径", logDirPath); clipboard.setPrimaryClip(clip); showToast("日志目录路径已复制: " + logDirPath); } } /** * 写入测试日志 */ private void writeTestLogs() { // 写入一些测试日志 LogManager.logInfo("DEBUG", "这是一条测试信息日志 - " + new Date()); LogManager.logWarning("DEBUG", "这是一条测试警告日志 - " + new Date()); LogManager.logError("DEBUG", "这是一条测试错误日志 - " + new Date()); LogManager.logOperation("测试操作", "用户触发测试日志写入"); LogManager.logPerformance("测试性能", 88); logMessage("测试日志已写入,请稍后再查看路径信息"); showToast("测试日志已写入"); } /** * 显示自启动状态 */ private void showAutoStartStatus() { if (autoStartManager != null) { String statusInfo = autoStartManager.getAutoStartStatusInfo(); logMessage("自启动状态信息:\n" + statusInfo); showToast("自启动状态信息已显示"); } else { logMessage("自启动管理器未初始化"); showToast("自启动管理器未初始化"); } } /** * 重置统计信息 */ private void resetAutoStartStats() { if (autoStartManager != null) { autoStartManager.resetAutoStartStats(); logMessage("自启动统计信息已重置"); showToast("自启动统计信息已重置"); } else { logMessage("自启动管理器未初始化"); showToast("自启动管理器未初始化"); } } /** * 显示设备信息 */ private void showDeviceInfo() { String deviceInfo = DeviceUtils.getDeviceInfo(this); logMessage("设备信息:\n" + deviceInfo); showToast("设备信息已显示"); } /** * 测试网络连接 */ private void testNetworkConnection() { logMessage("正在测试网络连接..."); boolean isConnected = UtilCodeHelper.Network.isConnected(); logMessage("网络连接状态: " + (isConnected ? "已连接" : "未连接")); showToast("网络连接测试完成"); } /** * 清空日志 */ private void clearLogs() { // 删除日志目录中的所有文件 LogManager logManager = LogManager.getInstance(this); File logDir = logManager.getLogDirectory(); if (logDir.exists() && logDir.isDirectory()) { File[] logFiles = logDir.listFiles(); if (logFiles != null) { for (File file : logFiles) { if (file.isFile()) { file.delete(); } } } } logMessage("日志已清空"); showToast("日志已清空"); } /** * 测试Shell命令 */ private void testShellCommand() { logMessage("测试Shell命令执行..."); try { // 执行简单的Shell命令 String result = UtilCodeHelper.Device.getModel(); logMessage("设备型号: " + result); showToast("设备信息获取完成"); } catch (Exception e) { Log.e(TAG, "设备信息获取失败", e); logMessage("设备信息获取失败: " + e.getMessage()); showToast("设备信息获取失败"); } } /** * 测试闹钟 */ private void testAlarm() { logMessage("测试闹钟功能..."); try { // 设置一个5秒后的闹钟测试 Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("auto_start", true); intent.putExtra("boot_reason", "alarm_test"); intent.putExtra("start_source", "debug_test"); // 使用BootSimulationHelper来设置测试闹钟 BootSimulationHelper.simulateBootCompleted(this); logMessage("闹钟测试已触发,将在系统启动模拟后执行"); showToast("闹钟测试已触发"); } catch (Exception e) { Log.e(TAG, "闹钟测试失败", e); logMessage("闹钟测试失败: " + e.getMessage()); showToast("闹钟测试失败"); } } /** * 初始化人脸SDK */ private void initFaceSDK() { logMessage("开始初始化人脸SDK..."); try { FaceSDKManager faceSDKManager = FaceSDKManager.getInstance(); // 打印SDK版本信息 logMessage("人脸SDK管理器实例获取成功"); logMessage("当前SDK初始化状态: " + FaceSDKManager.initStatus); faceSDKManager.init(this, "GEXH-QSMV-3MDX-Y9XS", new SdkInitListener() { @Override public void initStart() { logMessage("人脸SDK授权初始化开始..."); logMessage("设备信息: " + android.os.Build.MODEL + " (" + android.os.Build.VERSION.SDK_INT + ")"); } @Override public void initLicenseSuccess() { logMessage("人脸SDK授权成功"); // 获取并显示授权信息 String licenseData = faceSDKManager.getLicenseData(DebugActivity.this); logMessage("人脸SDK授权有效期至: " + licenseData); logMessage("授权后SDK状态: " + FaceSDKManager.initStatus); showToast("人脸SDK授权成功"); // 授权成功后继续初始化模型 initFaceModels(); } @Override public void initLicenseFail(int errorCode, String msg) { logMessage("人脸SDK授权失败 - 错误码: " + errorCode + ", 错误信息: " + msg); logMessage("失败时SDK状态: " + FaceSDKManager.initStatus); showToast("人脸SDK授权失败"); } @Override public void initModelSuccess() { // 这个回调在init方法中不会触发,因为init方法不初始化模型 } @Override public void initModelFail(int errorCode, String msg) { // 这个回调在init方法中不会触发,因为init方法不初始化模型 } }); } catch (Exception e) { Log.e(TAG, "初始化人脸SDK失败", e); logMessage("初始化人脸SDK失败: " + e.getMessage()); showToast("初始化人脸SDK失败"); } } /** * 初始化人脸模型 */ private void initFaceModels() { logMessage("开始初始化人脸模型..."); logMessage("初始化前模型状态: " + FaceSDKManager.initModelSuccess); try { FaceSDKManager faceSDKManager = FaceSDKManager.getInstance(); // 初始化模型 faceSDKManager.initModel(this, new SdkInitListener() { @Override public void initStart() { logMessage("人脸模型初始化开始..."); } @Override public void initLicenseSuccess() { // 授权已在initFaceSDK中处理 } @Override public void initLicenseFail(int errorCode, String msg) { // 授权已在initFaceSDK中处理 } @Override public void initModelSuccess() { logMessage("人脸SDK模型初始化成功"); logMessage("模型初始化完成,当前状态: " + FaceSDKManager.initModelSuccess); showToast("人脸SDK模型初始化成功"); logMessage("人脸SDK初始化完成,可以开始使用人脸识别功能"); logMessage("SDK最终状态 - 授权: " + FaceSDKManager.initStatus + ", 模型: " + FaceSDKManager.initModelSuccess); } @Override public void initModelFail(int errorCode, String msg) { logMessage("人脸SDK模型初始化失败 - 错误码: " + errorCode + ", 错误信息: " + msg); logMessage("模型初始化失败,当前状态: " + FaceSDKManager.initModelSuccess); showToast("人脸SDK模型初始化失败"); } }); } catch (Exception e) { Log.e(TAG, "初始化人脸模型失败", e); logMessage("初始化人脸模型失败: " + e.getMessage()); showToast("初始化人脸模型失败"); } } /** * 启动人脸识别测试 */ private void startFaceRecognitionTest() { logMessage("启动人脸识别测试..."); try { Intent intent = new Intent(this, OXFaceOnlineActivity.class); startActivity(intent); logMessage("已启动人脸识别测试界面"); showToast("已启动人脸识别测试界面"); } catch (Exception e) { Log.e(TAG, "启动人脸识别测试失败", e); logMessage("启动人脸识别测试失败: " + e.getMessage()); showToast("启动人脸识别测试失败"); } } /** * 测试华为扫码功能 */ private void testHuaWeiScan() { logMessage("触发华为扫码测试..."); HuaWeiScanManager.doScan(this, new HuaWeiScanManager.ScanResultListener() { @Override public void onScanSuccess(String scanResult) { logMessage("华为扫码成功: " + scanResult); showToast("扫码成功: " + scanResult); } @Override public void onScanFailed(int errorCode, String errorMsg) { logMessage("华为扫码失败 - 错误码: " + errorCode + ", 错误信息: " + errorMsg); showToast("扫码失败: " + errorMsg); } }); } /** * 在日志输出区域添加消息 * @param message 要添加的消息 */ private void logMessage(String message) { runOnUiThread(new Runnable() { @Override public void run() { String currentTime = android.text.format.DateFormat.format("HH:mm:ss", new Date()).toString(); String logEntry = "[" + currentTime + "] " + message + "\n"; tvLogOutput.append(logEntry); // 滚动到底部 logScrollView.post(new Runnable() { @Override public void run() { logScrollView.fullScroll(View.FOCUS_DOWN); } }); } }); } /** * 显示Toast消息 * @param message 要显示的消息 */ private void showToast(String message) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(DebugActivity.this, message, Toast.LENGTH_SHORT).show(); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 处理华为扫码结果 boolean handled = HuaWeiScanManager.handleScanResult(requestCode, resultCode, data, new HuaWeiScanManager.ScanResultListener() { @Override public void onScanSuccess(String scanResult) { logMessage("华为扫码成功: " + scanResult); showToast("扫码成功: " + scanResult); } @Override public void onScanFailed(int errorCode, String errorMsg) { logMessage("华为扫码失败 - 错误码: " + errorCode + ", 错误信息: " + errorMsg); showToast("扫码失败: " + errorMsg); } }); if (!handled) { // 如果没有处理扫码结果,可以在这里处理其他ActivityResult logMessage("未处理扫码结果,继续处理其他ActivityResult"); } } /** * 测试485人数获取功能 */ private void test485PeopleNum() { logMessage("开始485人数测试..."); if (ox485 == null) { logMessage("Ox485未初始化"); showToast("Ox485未初始化"); return; } try { // 设置485模式开关为启用状态 ox485.setGateCamera485OxOn(true); logMessage("已启用485模式"); // 调用sendHex485ForPeopleNum方法 ox485.sendHex485ForPeopleNum(new Ox485.PeopleNumCallback() { @Override public void onSuccess(int peopleNum) { logMessage("485人数获取成功: " + peopleNum + " 人"); Log.i(TAG, "485人数获取成功: " + peopleNum + " 人"); showToast("485人数获取成功: " + peopleNum + " 人"); } @Override public void onError(String errorMessage) { logMessage("485人数获取失败: " + errorMessage); Log.e(TAG, "485人数获取失败: " + errorMessage); showToast("485人数获取失败: " + errorMessage); } }); logMessage("已发送485人数查询请求,等待响应..."); showToast("正在查询485人数..."); } catch (Exception e) { Log.e(TAG, "485人数测试失败", e); logMessage("485人数测试失败: " + e.getMessage()); showToast("485人数测试失败"); } } /** * 测试GateABController的485人数获取功能 */ private void testGateAB485PeopleNum() { logMessage("开始测试GateAB控制器485人数获取..."); if (gateABController == null) { logMessage("GateABController未初始化"); showToast("GateABController未初始化"); return; } try { // 获取当前配置信息 GateABController.GateABConfig config = gateABController.getCurrentConfig(); logMessage("AB门当前配置 - 485模式: " + config.gateCamera485OXOn); // 检查485模式状态 boolean is485Enabled = gateABController.is485ModeEnabled(); logMessage("485模式状态: " + (is485Enabled ? "已启用" : "未启用")); // 获取485状态信息 String status485 = gateABController.get485Status(); logMessage("485状态信息: " + status485); // 调用GateABController的get485PeopleNum方法 gateABController.get485PeopleNum(new GateABController.PeopleNumCallback() { @Override public void onSuccess(int peopleNum) { logMessage("GateAB 485人数获取成功: " + peopleNum + " 人"); Log.i(TAG, "GateAB 485人数获取成功: " + peopleNum + " 人"); showToast("GateAB 485人数获取成功: " + peopleNum + " 人"); } @Override public void onError(String errorMessage) { logMessage("GateAB 485人数获取失败: " + errorMessage); Log.e(TAG, "GateAB 485人数获取失败: " + errorMessage); showToast("GateAB 485人数获取失败: " + errorMessage); } }); logMessage("已通过GateABController发送485人数查询请求,等待响应..."); showToast("通过GateAB查询485人数..."); } catch (Exception e) { Log.e(TAG, "GateAB 485人数测试失败", e); logMessage("GateAB 485人数测试失败: " + e.getMessage()); showToast("GateAB 485人数测试失败"); } } }