3 changed files with 397 additions and 69 deletions
-
91app/src/main/java/com/ouxuan/oxface/MainActivity.java
-
278app/src/main/java/com/ouxuan/oxface/data/LoginDataManager.java
-
95app/src/main/java/com/ouxuan/oxface/device/DeviceUtils.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; |
|||
} |
|||
} |
@ -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, "=================="); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue