Android 创建唯一标识UUID
2024-01-28 本文已影响0人
不会弹钢琴de大叔
使用该方法创建当前应用内唯一识别码
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.provider.Settings.Secure;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.UUID;
public class DeviceUuidFactory {
protected static final String PREFS_FILE = "device_id.xml";
protected static final String PREFS_DEVICE_ID = "device_id";
protected static UUID uuid;
@SuppressLint("HardwareIds")
public DeviceUuidFactory(Context context) {
if (uuid == null) {
final SharedPreferences prefs = context.getSharedPreferences(PREFS_FILE, 0);
final String id = prefs.getString(PREFS_DEVICE_ID, null);
if (id != null) {
uuid = UUID.fromString(id);
} else {
final String androidId = Secure.getString(context.getContentResolver(),
Secure.ANDROID_ID);
if (!"9774d56d682e549c".equals(androidId)) {
uuid = UUID.nameUUIDFromBytes(androidId
.getBytes(StandardCharsets.UTF_8));
} else {
uuid = generateDeviceUuid(context);
}
prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).apply();
}
}
}
@SuppressLint("HardwareIds")
private UUID generateDeviceUuid(Context context) {
String buildParams = Build.BOARD + Build.BRAND + Build.CPU_ABI
+ Build.DEVICE + Build.DISPLAY + Build.FINGERPRINT + Build.HOST
+ Build.ID + Build.MANUFACTURER + Build.MODEL + Build.PRODUCT
+ Build.TAGS + Build.TYPE + Build.USER;
String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
// requires ACCESS_WIFI_STATE
WifiManager wm = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
// gets the MAC address
String mac = wm.getConnectionInfo().getMacAddress();
// if we've got nothing, return a random UUID
if (isEmpty(androidId) && isEmpty(mac)) {
return UUID.randomUUID();
}
// concatenate the string
String fullHash = buildParams + androidId + mac;
return UUID.nameUUIDFromBytes(fullHash.getBytes());
}
public UUID getDeviceUuid() {
return uuid;
}
private static boolean isEmpty(Object obj) {
if (obj == null) {
return true;
}
if ((obj instanceof String) && (((String) obj).trim().length() == 0)) {
return true;
}
if (obj instanceof Map) {
return ((Map<?, ?>) obj).isEmpty();
}
return false;
}
}
使用方法()
DeviceUuidFactory uuidFactory = new DeviceUuidFactory(getApplicationContext());
String uuid = uuidFactory.getDeviceUuid().toString();