Browse Source

finish qrcode in face detect view

main
MTing 1 week ago
parent
commit
219a29d095
  1. 2
      app/src/main/AndroidManifest.xml
  2. 73
      app/src/main/java/com/ouxuan/oxface/MainActivity.java
  3. 44
      app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java
  4. 64
      app/src/main/java/com/ouxuan/oxface/data/DeviceSelectDataManager.java
  5. 33
      app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java
  6. 55
      app/src/main/java/com/ouxuan/oxface/network/utils/NetworkUtils.java
  7. 8
      app/src/main/res/layout/activity_oxface_online.xml

2
app/src/main/AndroidManifest.xml

@ -117,7 +117,7 @@
<!-- 验证码开门Activity -->
<activity
android:name=".VerificationCodeActivity"
android:name=".orderOX.VerificationCodeActivity"
android:exported="false"
android:theme="@style/Theme.Transparent" />
</application>

73
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<PadApiService.GetWXACodeResponse>() {
@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() {

44
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);

64
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;
}
}

33
app/src/main/java/com/ouxuan/oxface/network/api/PadApiService.java

@ -95,6 +95,23 @@ public interface PadApiService {
@GET("v3/pad/miniQrcode")
Call<ResponseBody> 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<ApiResponse<GetWXACodeResponse>> 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; }
}
}

55
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<PadApiService.GetWXACodeResponse> 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<ApiResponse<PadApiService.GetWXACodeResponse>>() {
@Override
public void onResponse(Call<ApiResponse<PadApiService.GetWXACodeResponse>> call,
Response<ApiResponse<PadApiService.GetWXACodeResponse>> response) {
try {
if (response.isSuccessful() && response.body() != null) {
ApiResponse<PadApiService.GetWXACodeResponse> 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<ApiResponse<PadApiService.GetWXACodeResponse>> call, Throwable t) {
callback.onException(t);
callback.onComplete();
}
});
}
}

8
app/src/main/res/layout/activity_oxface_online.xml

@ -266,8 +266,8 @@
<ImageView
android:id="@+id/img_mini_program_code"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/ic_placeholder_circle"
android:background="@drawable/circle_background" />
@ -321,7 +321,7 @@
android:minHeight="40dp"
android:text="验证码开门"
android:textColor="#FFFFFF"
android:textSize="14sp" />
android:textSize="13sp" />
<Button
android:id="@+id/btn_scanner_door"
@ -331,7 +331,7 @@
android:minHeight="40dp"
android:text="扫码器开门"
android:textColor="#FFFFFF"
android:textSize="14sp" />
android:textSize="13sp" />
</LinearLayout>
</LinearLayout>

Loading…
Cancel
Save