version:1.0.4
fix: update:增加下载
This commit is contained in:
100
app/src/main/java/com/xwad/os/manager/DeviceSNManager.java
Normal file
100
app/src/main/java/com/xwad/os/manager/DeviceSNManager.java
Normal file
@@ -0,0 +1,100 @@
|
||||
package com.xwad.os.manager;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.tencent.mmkv.MMKV;
|
||||
import com.xwad.os.config.CommonConfig;
|
||||
|
||||
import java.util.Random;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
||||
public class DeviceSNManager {
|
||||
private static final String SN_KEY = "device_sn";
|
||||
private static final String PREFIX = "CDSN";
|
||||
private static final int RANDOM_DIGITS = 9;
|
||||
|
||||
private static MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
|
||||
|
||||
public DeviceSNManager() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取设备SN,如果不存在则创建新的
|
||||
*/
|
||||
public static String getDeviceSN() {
|
||||
String existingSN = mMMKV.decodeString(SN_KEY, "");
|
||||
|
||||
if (!TextUtils.isEmpty(existingSN)) {
|
||||
return existingSN;
|
||||
}
|
||||
String newSN = generateNewSN();
|
||||
mMMKV.encode(SN_KEY, newSN);
|
||||
return newSN;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成新的设备SN
|
||||
* 格式:CDSN202511T923852225
|
||||
*/
|
||||
private static String generateNewSN() {
|
||||
StringBuilder snBuilder = new StringBuilder();
|
||||
// 添加前缀
|
||||
snBuilder.append(PREFIX);
|
||||
// 添加年份月份
|
||||
String timeYear = formatTimestamp(System.currentTimeMillis());
|
||||
snBuilder.append(timeYear);
|
||||
|
||||
// 添加基于时间戳的9位随机数字
|
||||
snBuilder.append(generateRandomString(10));
|
||||
|
||||
return snBuilder.toString();
|
||||
}
|
||||
|
||||
// 定义可供随机选择的字符池
|
||||
private static final String LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
private static final String LETTERS_AND_DIGITS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
|
||||
public static String generateRandomString(int length) {
|
||||
if (length < 1) {
|
||||
throw new IllegalArgumentException("Length must be at least 1");
|
||||
}
|
||||
|
||||
Random random = new Random();
|
||||
StringBuilder sb = new StringBuilder(length);
|
||||
|
||||
// 第一位:确保是字母
|
||||
sb.append(LETTERS.charAt(random.nextInt(LETTERS.length())));
|
||||
|
||||
// 剩余位数:字母或数字
|
||||
for (int i = 1; i < length; i++) {
|
||||
sb.append(LETTERS_AND_DIGITS.charAt(random.nextInt(LETTERS_AND_DIGITS.length())));
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除已存储的SN(用于测试或重新生成)
|
||||
*/
|
||||
public static void clearDeviceSN() {
|
||||
mMMKV.removeValueForKey(SN_KEY);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否已存在SN
|
||||
*/
|
||||
public static boolean hasDeviceSN() {
|
||||
return mMMKV.containsKey(SN_KEY) && !TextUtils.isEmpty(mMMKV.decodeString(SN_KEY, ""));
|
||||
}
|
||||
|
||||
public static String formatTimestamp(long timestamp) {
|
||||
// 创建指定格式的格式化对象,"yyyyMM" 表示6位数字的年份和月份,"'T'" 表示字面量字符 T
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM'T'");
|
||||
Date date = new Date(timestamp);
|
||||
// 将 Date 对象格式化为字符串
|
||||
return sdf.format(date);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user