diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 64e4e35..56e4ec8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -117,7 +117,7 @@
diff --git a/app/src/main/java/com/ouxuan/oxface/MainActivity.java b/app/src/main/java/com/ouxuan/oxface/MainActivity.java
index 0874625..fc237f7 100644
--- a/app/src/main/java/com/ouxuan/oxface/MainActivity.java
+++ b/app/src/main/java/com/ouxuan/oxface/MainActivity.java
@@ -743,6 +743,9 @@ public class MainActivity extends AppCompatActivity {
// 新增:调用获取小程序码接口
fetchAndSaveMiniQrcode(token, hardwareId, dialog, buttonEnter, buttonText, originalText);
+
+ // 新增:调用获取上传人脸小程序码接口
+ fetchAndSaveUploadFaceMiniQrcode(token, hardwareId, dialog, buttonEnter, buttonText, originalText);
}
@Override
@@ -1247,6 +1250,76 @@ public class MainActivity extends AppCompatActivity {
}
/**
+ * 获取并保存上传人脸小程序码
+ * @param token 访问令牌
+ * @param hardwareId 硬件ID
+ * @param dialog 弹框实例
+ * @param buttonEnter 进入按钮
+ * @param buttonText 按钮文字视图
+ * @param originalText 原始按钮文字
+ */
+ private void fetchAndSaveUploadFaceMiniQrcode(String token, int hardwareId, Dialog dialog, View buttonEnter, TextView buttonText, String originalText) {
+ // 获取品牌ID
+ int brandId = loginDataManager.getBrandId();
+
+ // 检查brandId是否有效
+ if (brandId <= 0) {
+ android.util.Log.e("MainActivity", "无效的品牌ID: " + brandId);
+ LogManager.logError("MainActivity", "获取上传人脸小程序码失败 - 无效的品牌ID: " + brandId);
+ // 即使获取上传人脸小程序码失败,也继续执行后续流程
+ initializeFaceSDKIfNeeded(dialog, buttonEnter, buttonText, originalText);
+ return;
+ }
+
+ // 调用获取上传人脸小程序码接口
+ NetworkUtils.getWXACodeUnlimit(token, hardwareId, brandId, new NetworkCallback() {
+ @Override
+ public void onStart() {
+ // 开始请求
+ android.util.Log.d("MainActivity", "开始请求上传人脸小程序码");
+ }
+
+ @Override
+ public void onSuccess(PadApiService.GetWXACodeResponse data) {
+ // 获取上传人脸小程序码成功
+ if (data != null && data.getUrl() != null && !data.getUrl().isEmpty()) {
+ // 保存上传人脸小程序码链接到本地
+ deviceSelectDataManager.saveUploadFaceMiniQrcodeUrl(data.getUrl());
+
+ android.util.Log.d("MainActivity", "上传人脸小程序码获取并保存成功: " + data.getUrl());
+ LogManager.logOperation("MainActivity", "上传人脸小程序码获取并保存成功");
+
+ // 添加调试日志,验证保存是否成功
+ String savedUrl = deviceSelectDataManager.getUploadFaceMiniQrcodeUrl();
+ boolean hasUrl = deviceSelectDataManager.hasUploadFaceMiniQrcodeUrl();
+ android.util.Log.d("MainActivity", "验证保存结果 - 是否存在: " + hasUrl + ", 保存的URL: " + savedUrl);
+ } else {
+ android.util.Log.w("MainActivity", "获取到的上传人脸小程序码数据为空或URL为空");
+ LogManager.logWarning("MainActivity", "获取到的上传人脸小程序码数据为空或URL为空");
+ }
+
+ // 继续执行后续流程
+ initializeFaceSDKIfNeeded(dialog, buttonEnter, buttonText, originalText);
+ }
+
+ @Override
+ public void onError(int errorCode, String errorMessage) {
+ // 获取上传人脸小程序码失败
+ android.util.Log.e("MainActivity", "获取上传人脸小程序码失败 - 错误码: " + errorCode + ", 错误信息: " + errorMessage);
+ LogManager.logError("MainActivity", "获取上传人脸小程序码失败 - 错误码: " + errorCode + ", 错误信息: " + errorMessage);
+
+ // 即使获取上传人脸小程序码失败,也继续执行后续流程
+ initializeFaceSDKIfNeeded(dialog, buttonEnter, buttonText, originalText);
+ }
+
+ @Override
+ public void onComplete() {
+ // 请求完成
+ }
+ });
+ }
+
+ /**
* 设置日志路径调试功能(长按登录按钮)
*/
private void setupLogPathDebug() {
diff --git a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java
index 24683b1..2d629d3 100644
--- a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java
+++ b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java
@@ -1156,8 +1156,9 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
LogManager.logInfo(TAG, "开始更新小程序码");
try {
DeviceSelectDataManager deviceSelectDataManager = DeviceSelectDataManager.getInstance(this);
- boolean hasQrcode = deviceSelectDataManager.hasMiniQrcodeUrl();
+ // 更新普通小程序码(扫码开门)
+ boolean hasQrcode = deviceSelectDataManager.hasMiniQrcodeUrl();
if (hasQrcode) {
String base64Qrcode = deviceSelectDataManager.getMiniQrcodeUrl();
if (base64Qrcode != null && !base64Qrcode.isEmpty()) {
@@ -1178,20 +1179,51 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
Bitmap qrcodeBitmap = BitmapUtils.base64ToBitmap(decodedBase64);
if (qrcodeBitmap != null && imgScanDoorQRCode != null) {
imgScanDoorQRCode.setImageBitmap(qrcodeBitmap);
- LogManager.logInfo(TAG, "小程序码更新成功");
+ LogManager.logInfo(TAG, "扫码开门小程序码更新成功");
+ } else {
+ LogManager.logWarning(TAG, "扫码开门小程序码更新失败");
+ }
+ } catch (Exception e) {
+ LogManager.logError(TAG, "更新扫码开门小程序码异常: " + e.getMessage(), e);
+ }
+ }
+ });
+ } else {
+ LogManager.logWarning(TAG, "扫码开门小程序码数据为空");
+ }
+ } else {
+ LogManager.logDebug(TAG, "未找到扫码开门小程序码链接");
+ }
+
+ // 更新上传人脸小程序码
+ boolean hasUploadFaceQrcode = deviceSelectDataManager.hasUploadFaceMiniQrcodeUrl();
+ if (hasUploadFaceQrcode) {
+ String uploadFaceQrcodeUrl = deviceSelectDataManager.getUploadFaceMiniQrcodeUrl();
+ if (uploadFaceQrcodeUrl != null && !uploadFaceQrcodeUrl.isEmpty()) {
+ // 在主线程中更新UI
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ // 使用Glide加载网络图片
+ if (imgMiniProgramCode != null) {
+ com.bumptech.glide.Glide.with(OXFaceOnlineActivity.this)
+ .load(uploadFaceQrcodeUrl)
+ .into(imgMiniProgramCode);
+ LogManager.logInfo(TAG, "上传人脸小程序码更新成功: " + uploadFaceQrcodeUrl);
} else {
- LogManager.logWarning(TAG, "小程序码更新失败");
+ LogManager.logWarning(TAG, "上传人脸小程序码ImageView为空");
}
} catch (Exception e) {
- LogManager.logError(TAG, "更新小程序码异常: " + e.getMessage(), e);
+ LogManager.logError(TAG, "更新上传人脸小程序码异常: " + e.getMessage(), e);
}
}
});
} else {
- LogManager.logWarning(TAG, "小程序码数据为空");
+ LogManager.logWarning(TAG, "上传人脸小程序码URL为空");
}
} else {
- LogManager.logDebug(TAG, "未找到小程序码链接");
+ LogManager.logDebug(TAG, "未找到上传人脸小程序码链接");
}
} catch (Exception e) {
LogManager.logError(TAG, "获取小程序码异常: " + e.getMessage(), e);
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 5d3f56a..26fcd42 100644
--- a/app/src/main/java/com/ouxuan/oxface/data/DeviceSelectDataManager.java
+++ b/app/src/main/java/com/ouxuan/oxface/data/DeviceSelectDataManager.java
@@ -37,6 +37,7 @@ public class DeviceSelectDataManager {
// 新增:小程序码链接存储常量
private static final String KEY_MINI_QRCODE_URL = "mini_qrcode_url";
+ private static final String KEY_UPLOAD_FACE_MINI_QRCODE_URL = "upload_face_mini_qrcode_url";
private SharedPreferences preferences;
private Gson gson;
@@ -50,8 +51,9 @@ public class DeviceSelectDataManager {
private boolean isDeviceSelected = false;
// 新增:人脸识别许可证内存缓存
private String faceLicense;
- // 新增:小程序码链接内存缓存
+ // 小程序码链接缓存
private String miniQrcodeUrl;
+ private String uploadFaceMiniQrcodeUrl;
// API响应存储
private int apiResponseCode;
@@ -627,6 +629,38 @@ public class DeviceSelectDataManager {
}
/**
+ * 保存上传人脸小程序码链接
+ * @param qrcodeUrl 上传人脸小程序码链接
+ */
+ public void saveUploadFaceMiniQrcodeUrl(String qrcodeUrl) {
+ android.util.Log.d(TAG, "开始保存上传人脸小程序码链接: " + qrcodeUrl);
+
+ if (qrcodeUrl == null || qrcodeUrl.isEmpty()) {
+ Log.w(TAG, "上传人脸小程序码链接为空,无法保存");
+ android.util.Log.w(TAG, "上传人脸小程序码链接为空,无法保存");
+ return;
+ }
+
+ try {
+ // 保存到内存缓存
+ this.uploadFaceMiniQrcodeUrl = qrcodeUrl;
+
+ // 保存到持久化存储
+ SharedPreferences.Editor editor = preferences.edit();
+ editor.putString(KEY_UPLOAD_FACE_MINI_QRCODE_URL, qrcodeUrl);
+ boolean commitResult = editor.commit(); // 使用commit确保立即保存
+
+ android.util.Log.d(TAG, "上传人脸小程序码链接保存结果: " + commitResult);
+
+ Log.d(TAG, "上传人脸小程序码链接保存成功: " + qrcodeUrl);
+ android.util.Log.d(TAG, "上传人脸小程序码链接保存成功: " + qrcodeUrl);
+ } catch (Exception e) {
+ Log.e(TAG, "保存上传人脸小程序码链接失败: " + e.getMessage(), e);
+ android.util.Log.e(TAG, "保存上传人脸小程序码链接失败: " + e.getMessage(), e);
+ }
+ }
+
+ /**
* 获取小程序码链接
* @return 小程序码链接
*/
@@ -644,6 +678,23 @@ public class DeviceSelectDataManager {
}
/**
+ * 获取上传人脸小程序码链接
+ * @return 上传人脸小程序码链接
+ */
+ public String getUploadFaceMiniQrcodeUrl() {
+ android.util.Log.d(TAG, "开始获取上传人脸小程序码链接");
+
+ if (uploadFaceMiniQrcodeUrl != null) {
+ android.util.Log.d(TAG, "从内存缓存获取上传人脸小程序码链接: " + uploadFaceMiniQrcodeUrl);
+ return uploadFaceMiniQrcodeUrl;
+ }
+
+ String url = preferences.getString(KEY_UPLOAD_FACE_MINI_QRCODE_URL, "");
+ android.util.Log.d(TAG, "从持久化存储获取上传人脸小程序码链接: " + url);
+ return url;
+ }
+
+ /**
* 检查是否存在有效的小程序码链接
* @return true如果存在有效的小程序码链接
*/
@@ -653,4 +704,15 @@ public class DeviceSelectDataManager {
android.util.Log.d(TAG, "检查是否存在小程序码链接: " + result + ", URL: " + url);
return result;
}
+
+ /**
+ * 检查是否存在有效的上传人脸小程序码链接
+ * @return true如果存在有效的上传人脸小程序码链接
+ */
+ public boolean hasUploadFaceMiniQrcodeUrl() {
+ String url = getUploadFaceMiniQrcodeUrl();
+ boolean result = url != null && !url.isEmpty();
+ android.util.Log.d(TAG, "检查是否存在上传人脸小程序码链接: " + result + ", URL: " + url);
+ return result;
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java b/app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java
index a3e05c2..ad8eeef 100644
--- a/app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java
+++ b/app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java
@@ -95,6 +95,23 @@ public interface PadApiService {
@GET("v3/pad/miniQrcode")
Call miniQrcode(@Query("token") String token,
@Query("hardware_id") int hardwareId);
+
+ /**
+ * 生成扫码上传人脸小程序码
+ * 对应新接口: /v3/pad/mp/GetWXACodeUnlimit
+ * @param token 访问令牌(必需)
+ * @param hardwareId 硬件ID(必需)
+ * @param brandId 品牌ID(必需)
+ * @param scene 场景参数(必需)
+ * @param page 页面路径(必需)
+ * @return 小程序码URL响应
+ */
+ @GET("v3/pad/mp/GetWXACodeUnlimit")
+ Call> getWXACodeUnlimit(@Query("token") String token,
+ @Query("hardware_id") int hardwareId,
+ @Query("brand_id") int brandId,
+ @Query("scene") String scene,
+ @Query("page") String page);
// ==================== 请求和响应数据模型 ====================
@@ -854,4 +871,20 @@ public interface PadApiService {
public String getQrcodeData() { return data; }
public void setQrcodeData(String qrcodeData) { this.data = qrcodeData; }
}
+
+ /**
+ * 小程序码URL响应模型 (用于GetWXACodeUnlimit接口)
+ */
+ public static class GetWXACodeResponse {
+ @SerializedName("qrcode_url")
+ private String qrcodeUrl; // 小程序码URL
+
+ // Getters and Setters
+ public String getQrcodeUrl() { return qrcodeUrl; }
+ public void setQrcodeUrl(String qrcodeUrl) { this.qrcodeUrl = qrcodeUrl; }
+
+ // 兼容旧代码的方法
+ public String getUrl() { return qrcodeUrl; }
+ public void setUrl(String url) { this.qrcodeUrl = url; }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/ouxuan/oxface/network/utils/NetworkUtils.java b/app/src/main/java/com/ouxuan/oxface/network/utils/NetworkUtils.java
index 600ca4f..e74b42c 100644
--- a/app/src/main/java/com/ouxuan/oxface/network/utils/NetworkUtils.java
+++ b/app/src/main/java/com/ouxuan/oxface/network/utils/NetworkUtils.java
@@ -697,4 +697,59 @@ public class NetworkUtils {
}
});
}
+
+ /**
+ * 生成扫码上传人脸小程序码
+ * 对应新接口: /v3/pad/mp/GetWXACodeUnlimit
+ * @param token 访问令牌
+ * @param hardwareId 硬件ID
+ * @param brandId 品牌ID
+ * @param callback 回调接口
+ */
+ public static void getWXACodeUnlimit(String token, int hardwareId, int brandId,
+ NetworkCallback callback) {
+ if (padApiService == null) {
+ callback.onError(-1, "NetworkUtils未初始化,请先调用init()方法");
+ return;
+ }
+
+ // 构造scene参数: "s=brand_id"
+ String scene = "s=" + brandId;
+
+ // 构造page参数: 小程序页面路径
+ String page = "subpackage/independent/pages/face_list/face_list";
+
+ callback.onStart();
+ padApiService.getWXACodeUnlimit(token, hardwareId, brandId, scene, page).enqueue(new Callback>() {
+ @Override
+ public void onResponse(Call> call,
+ Response> response) {
+ try {
+ if (response.isSuccessful() && response.body() != null) {
+ ApiResponse apiResponse = response.body();
+
+ if (apiResponse.isSuccess()) {
+ callback.onSuccess(apiResponse.getData());
+ } else {
+ callback.onError(apiResponse.getCode(), apiResponse.getMessage());
+ }
+ } else {
+ callback.onError(response.code(), "请求失败: " + response.message());
+ }
+ } catch (Exception e) {
+ android.util.Log.e("NetworkUtils", "获取小程序码URL失败", e);
+ callback.onException(e);
+ } finally {
+ callback.onComplete();
+ }
+ }
+
+ @Override
+ public void onFailure(Call> call, Throwable t) {
+ callback.onException(t);
+ callback.onComplete();
+ }
+ });
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_oxface_online.xml b/app/src/main/res/layout/activity_oxface_online.xml
index c8583bd..64fb56d 100644
--- a/app/src/main/res/layout/activity_oxface_online.xml
+++ b/app/src/main/res/layout/activity_oxface_online.xml
@@ -266,8 +266,8 @@
@@ -321,7 +321,7 @@
android:minHeight="40dp"
android:text="验证码开门"
android:textColor="#FFFFFF"
- android:textSize="14sp" />
+ android:textSize="13sp" />
+ android:textSize="13sp" />