From abc2ce6364d3dbf7c39ae3bcb03723654f1087ad Mon Sep 17 00:00:00 2001 From: MTing Date: Thu, 28 Aug 2025 18:27:18 +0800 Subject: [PATCH] change device_id to origin --- .../main/java/com/ouxuan/oxface/MainActivity.java | 93 ++----- .../com/ouxuan/oxface/data/LoginDataManager.java | 278 +++++++++++++++++++++ .../java/com/ouxuan/oxface/device/DeviceUtils.java | 95 +++++++ 3 files changed, 397 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/com/ouxuan/oxface/data/LoginDataManager.java create mode 100644 app/src/main/java/com/ouxuan/oxface/device/DeviceUtils.java diff --git a/app/src/main/java/com/ouxuan/oxface/MainActivity.java b/app/src/main/java/com/ouxuan/oxface/MainActivity.java index b4d5ddb..0359143 100644 --- a/app/src/main/java/com/ouxuan/oxface/MainActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/MainActivity.java @@ -23,6 +23,8 @@ import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.bumptech.glide.request.RequestOptions; +import com.ouxuan.oxface.data.LoginDataManager; +import com.ouxuan.oxface.device.DeviceUtils; import com.ouxuan.oxface.network.api.PadApiService; import com.ouxuan.oxface.network.api.UserApiService; import com.ouxuan.oxface.network.callback.NetworkCallback; @@ -36,7 +38,7 @@ public class MainActivity extends AppCompatActivity { private ImageView imageViewPasswordToggle; private Toast currentToast; // 用于管理Toast显示状态 private boolean isPasswordVisible = false; // 密码显示状态 - private PadApiService.PadLoginResponse currentLoginData; // 当前登录响应数据 + private LoginDataManager loginDataManager; // 登录数据管理器 @Override protected void onCreate(Bundle savedInstanceState) { @@ -54,6 +56,9 @@ public class MainActivity extends AppCompatActivity { // 初始化视图组件 initViews(); + // 初始化登录数据管理器 + loginDataManager = LoginDataManager.getInstance(this); + // 设置登录按钮点击事件 setupLoginButton(); @@ -162,9 +167,11 @@ public class MainActivity extends AppCompatActivity { } private void performLogin(String username, String password) { - // 使用Pad登录接口进行真实的API调用 - String deviceId = "ANDROID_" + android.provider.Settings.Secure.getString( - getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); + // 使用DeviceUtils获取设备ID进行真实的API调用 + String deviceId = DeviceUtils.getFormattedDeviceId(this); + + // 打印设备信息到日志(便于调试) + DeviceUtils.logDeviceInfo(this); NetworkUtils.padLogin(username, password, deviceId, new NetworkCallback() { @Override @@ -175,7 +182,7 @@ public class MainActivity extends AppCompatActivity { @Override public void onSuccess(PadApiService.PadLoginResponse data) { - // 登录成功,保存token和用户信息 + // 登录成功,使用LoginDataManager保存登录数据 android.util.Log.d("MainActivity", "Login success - data: " + (data != null ? data.toString() : "null")); if (data != null) { android.util.Log.d("MainActivity", "Token: " + data.getToken()); @@ -183,12 +190,11 @@ public class MainActivity extends AppCompatActivity { android.util.Log.d("MainActivity", "Brand ID: " + data.getBrandId()); } - // 保存登录响应数据 - currentLoginData = data; - - saveAuthToken(data.getToken()); - saveUserInfo(data.getUserInfo()); - saveSessionId(data.getSessionId()); + // 使用LoginDataManager保存登录数据 + loginDataManager.saveLoginData(data); + // 打印存储的data + android.util.Log.d("MainActivity", "Login Data: " + data.toString()); + // 显示登录成功弹框,传入登录数据 showToast("登录成功!"); @@ -387,61 +393,11 @@ public class MainActivity extends AppCompatActivity { } /** - * 保存认证Token - * @param token 认证Token - */ - private void saveAuthToken(String token) { - getSharedPreferences("app_prefs", MODE_PRIVATE) - .edit() - .putString("auth_token", token) - .apply(); - } - - /** - * 获取认证Token - * @return 认证Token - */ - private String getAuthToken() { - return getSharedPreferences("app_prefs", MODE_PRIVATE) - .getString("auth_token", ""); - } - - /** - * 保存用户信息 - * @param userInfo 用户信息 - */ - private void saveUserInfo(PadApiService.UserInfo userInfo) { - if (userInfo != null) { - getSharedPreferences("app_prefs", MODE_PRIVATE) - .edit() - .putString("user_id", userInfo.getUserId()) - .putString("username", userInfo.getUsername()) - .putString("nickname", userInfo.getNickname()) - .putString("store_id", userInfo.getStoreId()) - .putString("store_name", userInfo.getStoreName()) - .putString("role", userInfo.getRole()) - .apply(); - } - } - - /** - * 保存会话ID - * @param sessionId 会话ID - */ - private void saveSessionId(String sessionId) { - getSharedPreferences("app_prefs", MODE_PRIVATE) - .edit() - .putString("session_id", sessionId) - .apply(); - } - - /** * 获取用户ID * @return 用户ID */ private String getUserId() { - return getSharedPreferences("app_prefs", MODE_PRIVATE) - .getString("user_id", ""); + return loginDataManager.getUserId(); } /** @@ -449,8 +405,7 @@ public class MainActivity extends AppCompatActivity { * @return 会话ID */ private String getSessionId() { - return getSharedPreferences("app_prefs", MODE_PRIVATE) - .getString("session_id", ""); + return loginDataManager.getSessionId(); } /** @@ -466,11 +421,10 @@ public class MainActivity extends AppCompatActivity { spinner.setAdapter(loadingAdapter); // 调用API获取Pad列表,传入登录时获取的stadium_id、device_id和token - if (currentLoginData != null) { - int stadiumId = currentLoginData.getStadiumId(); - String token = currentLoginData.getToken(); - String deviceId = "ANDROID_" + android.provider.Settings.Secure.getString( - getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); + if (loginDataManager.isLoggedIn()) { + int stadiumId = loginDataManager.getStadiumId(); + String token = loginDataManager.getAuthToken(); + String deviceId = DeviceUtils.getFormattedDeviceId(this); android.util.Log.d("MainActivity", "Loading pad list with stadium_id: " + stadiumId + ", device_id: " + deviceId + ", token: " + (token != null ? "present" : "null")); @@ -485,6 +439,7 @@ public class MainActivity extends AppCompatActivity { public void onSuccess(PadApiService.PadListResponse data) { // 加载成功,更新下拉框数据 java.util.List padList = data.getPadList(); + java.util.List padNames = new java.util.ArrayList<>(); padNames.add("请选择设备"); // 默认选项 diff --git a/app/src/main/java/com/ouxuan/oxface/data/LoginDataManager.java b/app/src/main/java/com/ouxuan/oxface/data/LoginDataManager.java new file mode 100644 index 0000000..5a3dff3 --- /dev/null +++ b/app/src/main/java/com/ouxuan/oxface/data/LoginDataManager.java @@ -0,0 +1,278 @@ +package com.ouxuan.oxface.data; + +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Log; + +import com.google.gson.Gson; +import com.ouxuan.oxface.network.api.PadApiService; + +/** + * 登录数据管理器 + * 单例模式,用于全局存储和管理登录相关数据 + * 支持内存缓存和持久化存储 + */ +public class LoginDataManager { + + private static final String TAG = "LoginDataManager"; + private static final String PREFS_NAME = "login_data_prefs"; + private static final String KEY_LOGIN_DATA = "login_data"; + private static final String KEY_AUTH_TOKEN = "auth_token"; + private static final String KEY_DEVICE_ID = "device_id"; + private static final String KEY_USER_ID = "user_id"; + private static final String KEY_SESSION_ID = "session_id"; + private static final String KEY_IS_LOGGED_IN = "is_logged_in"; + + private static volatile LoginDataManager instance; + private SharedPreferences preferences; + private Gson gson; + + // 内存缓存 + private PadApiService.PadLoginResponse currentLoginData; + private boolean isLoggedIn = false; + + private LoginDataManager(Context context) { + preferences = context.getApplicationContext().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + gson = new Gson(); + loadLoginDataFromPrefs(); + } + + /** + * 获取LoginDataManager单例实例 + * @param context 上下文 + * @return LoginDataManager实例 + */ + public static LoginDataManager getInstance(Context context) { + if (instance == null) { + synchronized (LoginDataManager.class) { + if (instance == null) { + instance = new LoginDataManager(context); + } + } + } + return instance; + } + + /** + * 保存登录数据 + * @param loginData 登录响应数据 + */ + public void saveLoginData(PadApiService.PadLoginResponse loginData) { + if (loginData == null) { + Log.w(TAG, "登录数据为空,无法保存"); + return; + } + + // 保存到内存缓存 + this.currentLoginData = loginData; + this.isLoggedIn = true; + + // 保存到持久化存储 + SharedPreferences.Editor editor = preferences.edit(); + editor.putString(KEY_LOGIN_DATA, gson.toJson(loginData)); + editor.putString(KEY_AUTH_TOKEN, loginData.getToken()); + editor.putString(KEY_USER_ID, String.valueOf(loginData.getStadiumId())); // 使用stadium_id作为用户标识 + editor.putString(KEY_SESSION_ID, loginData.getToken()); // 使用token作为session_id + editor.putBoolean(KEY_IS_LOGGED_IN, true); + editor.apply(); + + Log.d(TAG, "登录数据保存成功"); + logLoginInfo(); + } + + /** + * 获取当前登录数据 + * @return 登录数据,如果未登录返回null + */ + public PadApiService.PadLoginResponse getLoginData() { + return currentLoginData; + } + + /** + * 获取认证Token + * @return Token字符串 + */ + public String getAuthToken() { + if (currentLoginData != null) { + return currentLoginData.getToken(); + } + return preferences.getString(KEY_AUTH_TOKEN, ""); + } + + /** + * 获取用户ID + * @return 用户ID + */ + public String getUserId() { + if (currentLoginData != null) { + return String.valueOf(currentLoginData.getStadiumId()); + } + return preferences.getString(KEY_USER_ID, ""); + } + + /** + * 获取会话ID + * @return 会话ID + */ + public String getSessionId() { + if (currentLoginData != null) { + return currentLoginData.getToken(); + } + return preferences.getString(KEY_SESSION_ID, ""); + } + + /** + * 获取场馆ID + * @return 场馆ID + */ + public int getStadiumId() { + if (currentLoginData != null) { + return currentLoginData.getStadiumId(); + } + return 0; + } + + /** + * 获取品牌ID + * @return 品牌ID + */ + public int getBrandId() { + if (currentLoginData != null) { + return currentLoginData.getBrandId(); + } + return 0; + } + + /** + * 获取店铺名称 + * @return 店铺名称 + */ + public String getStoreName() { + if (currentLoginData != null) { + return currentLoginData.getName(); + } + return ""; + } + + /** + * 获取店铺Logo URL + * @return Logo URL + */ + public String getStoreLogo() { + if (currentLoginData != null) { + return currentLoginData.getLogo(); + } + return ""; + } + + /** + * 检查是否已登录 + * @return true如果已登录,false否则 + */ + public boolean isLoggedIn() { + return isLoggedIn && currentLoginData != null; + } + + /** + * 设置设备ID + * @param deviceId 设备ID + */ + public void setDeviceId(String deviceId) { + preferences.edit().putString(KEY_DEVICE_ID, deviceId).apply(); + } + + /** + * 获取设备ID + * @return 设备ID + */ + public String getDeviceId() { + return preferences.getString(KEY_DEVICE_ID, ""); + } + + /** + * 清除登录数据(登出) + */ + public void clearLoginData() { + // 清除内存缓存 + this.currentLoginData = null; + this.isLoggedIn = false; + + // 清除持久化存储 + SharedPreferences.Editor editor = preferences.edit(); + editor.remove(KEY_LOGIN_DATA); + editor.remove(KEY_AUTH_TOKEN); + editor.remove(KEY_USER_ID); + editor.remove(KEY_SESSION_ID); + editor.putBoolean(KEY_IS_LOGGED_IN, false); + editor.apply(); + + Log.d(TAG, "登录数据已清除"); + } + + /** + * 从SharedPreferences加载登录数据 + */ + private void loadLoginDataFromPrefs() { + try { + String loginDataJson = preferences.getString(KEY_LOGIN_DATA, ""); + boolean savedIsLoggedIn = preferences.getBoolean(KEY_IS_LOGGED_IN, false); + + if (!loginDataJson.isEmpty() && savedIsLoggedIn) { + currentLoginData = gson.fromJson(loginDataJson, PadApiService.PadLoginResponse.class); + isLoggedIn = true; + Log.d(TAG, "从本地存储恢复登录数据成功"); + } else { + Log.d(TAG, "本地无有效登录数据"); + } + } catch (Exception e) { + Log.e(TAG, "加载登录数据失败: " + e.getMessage()); + // 清除可能损坏的数据 + clearLoginData(); + } + } + + /** + * 打印登录信息到日志 + */ + private void logLoginInfo() { + if (currentLoginData != null) { + Log.i(TAG, "=== 当前登录信息 ==="); + Log.i(TAG, "店铺名称: " + currentLoginData.getName()); + Log.i(TAG, "场馆ID: " + currentLoginData.getStadiumId()); + Log.i(TAG, "品牌ID: " + currentLoginData.getBrandId()); + Log.i(TAG, "Token: " + (currentLoginData.getToken() != null ? "已设置" : "未设置")); + Log.i(TAG, "Logo: " + (currentLoginData.getLogo() != null ? "已设置" : "未设置")); + Log.i(TAG, "=================="); + } + } + + /** + * 更新登录数据(部分更新) + * @param loginData 新的登录数据 + */ + public void updateLoginData(PadApiService.PadLoginResponse loginData) { + if (loginData != null) { + saveLoginData(loginData); + } + } + + /** + * 检查Token是否有效 + * @return true如果Token存在且不为空 + */ + public boolean isTokenValid() { + String token = getAuthToken(); + return token != null && !token.trim().isEmpty(); + } + + /** + * 获取用户信息对象(兼容旧代码) + * @return UserInfo对象 + */ + public PadApiService.UserInfo getUserInfo() { + if (currentLoginData != null) { + return currentLoginData.getUserInfo(); + } + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ouxuan/oxface/device/DeviceUtils.java b/app/src/main/java/com/ouxuan/oxface/device/DeviceUtils.java new file mode 100644 index 0000000..fc9829d --- /dev/null +++ b/app/src/main/java/com/ouxuan/oxface/device/DeviceUtils.java @@ -0,0 +1,95 @@ +package com.ouxuan.oxface.device; + +import android.content.Context; +import android.provider.Settings; +import android.util.Log; + +/** + * 设备工具类 + * 用于获取设备相关信息,包括设备ID、设备类型等 + */ +public class DeviceUtils { + + private static final String TAG = "DeviceUtils"; + + /** + * 获取设备 ID + * 为 mqtt 注册提供设备参数 + * @param context 上下文 + * @return 设备ID字符串 + */ + public static String getAndroidID(Context context) { + String android_id = ""; + try { + android_id = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); + Log.d(TAG, "Android ID: " + android_id); + } catch (Exception e) { + Log.e(TAG, "获取Android ID失败: " + e.getMessage()); + android_id = "unknown"; + } + return android_id; + } + + /** + * 获取格式化的设备ID + * 添加"ANDROID_"前缀,与网络请求中使用的格式保持一致 + * @param context 上下文 + * @return 格式化的设备ID + */ + public static String getFormattedDeviceId(Context context) { + String androidId = getAndroidID(context); + return androidId; + } + + /** + * 获取设备型号 + * @return 设备型号 + */ + public static String getDeviceModel() { + return android.os.Build.MODEL; + } + + /** + * 获取设备品牌 + * @return 设备品牌 + */ + public static String getDeviceBrand() { + return android.os.Build.BRAND; + } + + /** + * 获取Android版本 + * @return Android版本 + */ + public static String getAndroidVersion() { + return android.os.Build.VERSION.RELEASE; + } + + /** + * 获取设备信息摘要 + * @param context 上下文 + * @return 设备信息字符串 + */ + public static String getDeviceInfo(Context context) { + StringBuilder deviceInfo = new StringBuilder(); + deviceInfo.append("Device ID: ").append(getAndroidID(context)).append("\n"); + deviceInfo.append("Brand: ").append(getDeviceBrand()).append("\n"); + deviceInfo.append("Model: ").append(getDeviceModel()).append("\n"); + deviceInfo.append("Android Version: ").append(getAndroidVersion()); + return deviceInfo.toString(); + } + + /** + * 打印设备信息到日志 + * @param context 上下文 + */ + public static void logDeviceInfo(Context context) { + Log.i(TAG, "=== 设备信息 ==="); + Log.i(TAG, "Device ID: " + getAndroidID(context)); + Log.i(TAG, "Formatted Device ID: " + getFormattedDeviceId(context)); + Log.i(TAG, "Brand: " + getDeviceBrand()); + Log.i(TAG, "Model: " + getDeviceModel()); + Log.i(TAG, "Android Version: " + getAndroidVersion()); + Log.i(TAG, "=================="); + } +} \ No newline at end of file