oxFaceAndroid
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

825 lines
30 KiB

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人数测试失败");
}
}
}