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" />