diff --git a/app/src/main/java/com/ouxuan/oxface/MainActivity.java b/app/src/main/java/com/ouxuan/oxface/MainActivity.java index 47d9ed6..a520b84 100644 --- a/app/src/main/java/com/ouxuan/oxface/MainActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/MainActivity.java @@ -693,6 +693,9 @@ public class MainActivity extends AppCompatActivity { android.util.Log.d("MainActivity", "API Message: " + deviceSelectDataManager.getApiResponseMessage()); android.util.Log.d("MainActivity", "==============================="); + // 新增:检查并初始化人脸SDK + initializeFaceSDKIfNeeded(); + dialog.dismiss(); // 这里可以添加跳转到主界面的逻辑 @@ -724,6 +727,220 @@ public class MainActivity extends AppCompatActivity { }); } + /** + * 检查是否需要初始化人脸SDK并在需要时执行初始化 + */ + private void initializeFaceSDKIfNeeded() { + try { + // 检查是否有人脸识别许可证 + if (deviceSelectDataManager.hasFaceLicense()) { + String faceLicense = deviceSelectDataManager.getFaceLicense(); + String logMessage = "检测到人脸识别许可证,开始初始化人脸SDK,许可证长度: " + + (faceLicense != null ? faceLicense.length() : 0); + android.util.Log.d("MainActivity", logMessage); + LogManager.logInfo("FaceSDK", logMessage); + + // 在后台线程中初始化人脸SDK + new Thread(new Runnable() { + @Override + public void run() { + initializeFaceSDK(faceLicense); + } + }).start(); + } else { + String logMessage = "未检测到有效的人脸识别许可证,跳过人脸SDK初始化"; + android.util.Log.w("MainActivity", logMessage); + LogManager.logWarning("FaceSDK", logMessage); + } + } catch (Exception e) { + String logMessage = "检查人脸SDK初始化条件时发生异常: " + e.getMessage(); + android.util.Log.e("MainActivity", logMessage, e); + LogManager.logError("FaceSDK", logMessage, e); + } + } + + /** + * 初始化人脸SDK + * @param faceLicense 人脸识别许可证 + */ + private void initializeFaceSDK(String faceLicense) { + try { + String logMessage = "开始人脸SDK初始化流程..."; + android.util.Log.d("MainActivity", logMessage); + LogManager.logInfo("FaceSDK", logMessage); + + // 获取FaceSDKManager实例 + com.baidu.idl.face.main.finance.manager.FaceSDKManager faceSDKManager = + com.baidu.idl.face.main.finance.manager.FaceSDKManager.getInstance(); + + // 创建同步锁以等待初始化完成 + final Object initLock = new Object(); + final boolean[] initCompleted = {false}; + final boolean[] initSuccess = {false}; + + // 在主线程中执行初始化 + runOnUiThread(new Runnable() { + @Override + public void run() { + faceSDKManager.init(MainActivity.this, faceLicense, new com.baidu.idl.face.main.finance.listener.SdkInitListener() { + @Override + public void initStart() { + String logMessage = "人脸SDK授权初始化开始..."; + android.util.Log.d("MainActivity", logMessage); + LogManager.logInfo("FaceSDK", logMessage); + } + + @Override + public void initLicenseSuccess() { + String logMessage = "人脸SDK授权成功"; + android.util.Log.d("MainActivity", logMessage); + LogManager.logInfo("FaceSDK", logMessage); + // 授权成功后继续初始化模型 + initFaceModels(faceSDKManager, initLock, initCompleted, initSuccess); + } + + @Override + public void initLicenseFail(int errorCode, String msg) { + String logMessage = "人脸SDK授权失败 - 错误码: " + errorCode + ", 错误信息: " + msg; + android.util.Log.e("MainActivity", logMessage); + LogManager.logError("FaceSDK", logMessage); + synchronized (initLock) { + initCompleted[0] = true; + initSuccess[0] = false; + initLock.notifyAll(); + } + } + + @Override + public void initModelSuccess() { + // 这个回调在init方法中不会触发 + } + + @Override + public void initModelFail(int errorCode, String msg) { + // 这个回调在init方法中不会触发 + } + }); + } + }); + + // 等待初始化完成(最多等待30秒) + synchronized (initLock) { + if (!initCompleted[0]) { + try { + initLock.wait(30000); // 等待最多30秒 + } catch (InterruptedException e) { + logMessage = "人脸SDK初始化等待被中断: " + e.getMessage(); + android.util.Log.e("MainActivity", logMessage); + LogManager.logError("FaceSDK", logMessage); + } + } + } + + // 检查初始化结果 + if (initSuccess[0]) { + logMessage = "人脸SDK初始化成功"; + android.util.Log.d("MainActivity", logMessage); + LogManager.logInfo("FaceSDK", logMessage); + runOnUiThread(new Runnable() { + @Override + public void run() { + showToast("人脸SDK初始化成功"); + } + }); + } else { + logMessage = "人脸SDK初始化失败"; + android.util.Log.e("MainActivity", logMessage); + LogManager.logError("FaceSDK", logMessage); + runOnUiThread(new Runnable() { + @Override + public void run() { + showToast("人脸SDK初始化失败"); + } + }); + } + + } catch (Exception e) { + String logMessage = "初始化人脸SDK时发生异常: " + e.getMessage(); + android.util.Log.e("MainActivity", logMessage, e); + LogManager.logError("FaceSDK", logMessage, e); + runOnUiThread(new Runnable() { + @Override + public void run() { + showToast("人脸SDK初始化异常: " + e.getMessage()); + } + }); + } + } + + /** + * 初始化人脸模型 + * @param faceSDKManager FaceSDKManager实例 + * @param initLock 初始化同步锁 + * @param initCompleted 初始化完成标志 + * @param initSuccess 初始化成功标志 + */ + private void initFaceModels(com.baidu.idl.face.main.finance.manager.FaceSDKManager faceSDKManager, + Object initLock, boolean[] initCompleted, boolean[] initSuccess) { + try { + String logMessage = "开始初始化人脸模型..."; + android.util.Log.d("MainActivity", logMessage); + LogManager.logInfo("FaceSDK", logMessage); + + faceSDKManager.initModel(this, new com.baidu.idl.face.main.finance.listener.SdkInitListener() { + @Override + public void initStart() { + String logMessage = "人脸模型初始化开始..."; + android.util.Log.d("MainActivity", logMessage); + LogManager.logInfo("FaceSDK", logMessage); + } + + @Override + public void initLicenseSuccess() { + // 授权已在initFaceSDK中处理 + } + + @Override + public void initLicenseFail(int errorCode, String msg) { + // 授权已在initFaceSDK中处理 + } + + @Override + public void initModelSuccess() { + String logMessage = "人脸SDK模型初始化成功"; + android.util.Log.d("MainActivity", logMessage); + LogManager.logInfo("FaceSDK", logMessage); + synchronized (initLock) { + initCompleted[0] = true; + initSuccess[0] = true; + initLock.notifyAll(); + } + } + + @Override + public void initModelFail(int errorCode, String msg) { + String logMessage = "人脸SDK模型初始化失败 - 错误码: " + errorCode + ", 错误信息: " + msg; + android.util.Log.e("MainActivity", logMessage); + LogManager.logError("FaceSDK", logMessage); + synchronized (initLock) { + initCompleted[0] = true; + initSuccess[0] = false; + initLock.notifyAll(); + } + } + }); + } catch (Exception e) { + String logMessage = "初始化人脸模型时发生异常: " + e.getMessage(); + android.util.Log.e("MainActivity", logMessage, e); + LogManager.logError("FaceSDK", logMessage, e); + synchronized (initLock) { + initCompleted[0] = true; + initSuccess[0] = false; + initLock.notifyAll(); + } + } + } + @Override protected void onResume() { super.onResume(); diff --git a/app/src/main/java/com/ouxuan/oxface/data/DeviceSelectDataManager.java b/app/src/main/java/com/ouxuan/oxface/data/DeviceSelectDataManager.java index 6b1e684..5f8af34 100644 --- a/app/src/main/java/com/ouxuan/oxface/data/DeviceSelectDataManager.java +++ b/app/src/main/java/com/ouxuan/oxface/data/DeviceSelectDataManager.java @@ -32,6 +32,9 @@ public class DeviceSelectDataManager { private static final String KEY_API_RESPONSE_MESSAGE = "api_response_message"; private static final String KEY_API_FULL_RESPONSE = "api_full_response"; + // 新增:人脸识别许可证存储常量 + private static final String KEY_FACE_LICENSE = "face_license"; + private SharedPreferences preferences; private Gson gson; @@ -42,6 +45,8 @@ public class DeviceSelectDataManager { private PadApiService.PadSelectResponse currentSelectResponse; private PadApiService.PadInfo currentSelectedPadInfo; private boolean isDeviceSelected = false; + // 新增:人脸识别许可证内存缓存 + private String faceLicense; // API响应存储 private int apiResponseCode; @@ -93,6 +98,8 @@ public class DeviceSelectDataManager { // 将data对象转换为JSON字符串 if (apiResponse.getData() != null) { this.apiResponseDataJson = gson.toJson(apiResponse.getData()); + // 新增:提取并保存faceLicense + extractAndSaveFaceLicense(apiResponse.getData()); } // 将完整响应转换为JSON字符串 @@ -123,6 +130,11 @@ public class DeviceSelectDataManager { editor.putString(KEY_API_RESPONSE_MESSAGE, apiResponseMessage); editor.putString(KEY_API_FULL_RESPONSE, apiFullResponse); + // 新增:保存人脸识别许可证 + if (faceLicense != null && !faceLicense.isEmpty()) { + editor.putString(KEY_FACE_LICENSE, faceLicense); + } + editor.apply(); Log.d(TAG, "完整API响应数据保存成功"); @@ -238,6 +250,8 @@ public class DeviceSelectDataManager { this.apiResponseDataJson = null; this.apiResponseMessage = null; this.apiFullResponse = null; + // 新增:清除人脸识别许可证内存缓存 + this.faceLicense = null; // 清除持久化存储 SharedPreferences.Editor editor = preferences.edit(); @@ -255,6 +269,9 @@ public class DeviceSelectDataManager { editor.remove(KEY_API_RESPONSE_MESSAGE); editor.remove(KEY_API_FULL_RESPONSE); + // 新增:清除人脸识别许可证持久化存储 + editor.remove(KEY_FACE_LICENSE); + editor.apply(); Log.d(TAG, "设备选择数据已清除"); @@ -292,9 +309,23 @@ public class DeviceSelectDataManager { apiResponseMessage = preferences.getString(KEY_API_RESPONSE_MESSAGE, null); apiFullResponse = preferences.getString(KEY_API_FULL_RESPONSE, null); + // 新增:加载人脸识别许可证 + faceLicense = preferences.getString(KEY_FACE_LICENSE, null); + if (apiResponseCode > 0 || (apiResponseDataJson != null && !apiResponseDataJson.isEmpty())) { Log.d(TAG, "从本地存储恢复API响应数据成功"); } + + // 如果有API响应数据但没有faceLicense,尝试从响应数据中提取 + if ((apiResponseCode > 0 || (apiResponseDataJson != null && !apiResponseDataJson.isEmpty())) + && (faceLicense == null || faceLicense.isEmpty())) { + try { + PadApiService.PadSelectResponse response = gson.fromJson(apiResponseDataJson, PadApiService.PadSelectResponse.class); + extractAndSaveFaceLicense(response); + } catch (Exception e) { + Log.e(TAG, "从API响应数据中提取人脸识别许可证失败: " + e.getMessage()); + } + } } catch (Exception e) { Log.e(TAG, "加载设备选择数据失败: " + e.getMessage()); // 清除可能损坏的数据 @@ -345,6 +376,9 @@ public class DeviceSelectDataManager { this.currentSelectedPadInfo = selectedPadInfo; this.isDeviceSelected = true; + // 新增:提取并保存faceLicense + extractAndSaveFaceLicense(selectResponse); + // 保存到持久化存储 SharedPreferences.Editor editor = preferences.edit(); editor.putString(KEY_SELECT_RESPONSE, gson.toJson(selectResponse)); @@ -361,6 +395,12 @@ public class DeviceSelectDataManager { editor.putLong(KEY_VALID_UNTIL, selectResponse.getValidUntil()); editor.putLong(KEY_SELECT_TIME, System.currentTimeMillis()); editor.putBoolean(KEY_IS_DEVICE_SELECTED, true); + + // 新增:保存人脸识别许可证 + if (faceLicense != null && !faceLicense.isEmpty()) { + editor.putString(KEY_FACE_LICENSE, faceLicense); + } + editor.apply(); Log.d(TAG, "设备选择数据保存成功"); @@ -488,4 +528,46 @@ public class DeviceSelectDataManager { Log.i(TAG, "=============================="); } + + /** + * 从PadSelectResponse中提取人脸识别许可证并保存到内存缓存 + * @param response PadSelectResponse对象 + */ + private void extractAndSaveFaceLicense(PadApiService.PadSelectResponse response) { + try { + if (response != null && response.getPadConfig() != null) { + String license = response.getPadConfig().getFaceLicense(); + if (license != null && !license.isEmpty()) { + this.faceLicense = license; + Log.d(TAG, "人脸识别许可证提取成功,长度: " + license.length()); + } else { + Log.w(TAG, "人脸识别许可证为空或不存在"); + } + } else { + Log.w(TAG, "无法提取人脸识别许可证:PadSelectResponse或PadConfig为空"); + } + } catch (Exception e) { + Log.e(TAG, "提取人脸识别许可证失败: " + e.getMessage(), e); + } + } + + /** + * 获取人脸识别许可证 + * @return 人脸识别许可证字符串 + */ + public String getFaceLicense() { + if (faceLicense != null) { + return faceLicense; + } + return preferences.getString(KEY_FACE_LICENSE, ""); + } + + /** + * 检查是否存在有效的人脸识别许可证 + * @return true如果存在有效的人脸识别许可证 + */ + public boolean hasFaceLicense() { + String license = getFaceLicense(); + return license != null && !license.isEmpty(); + } } \ No newline at end of file