如何在Android中通过Java代码获取重置后不变的唯一设备ID?
如何通过Java获取设备重置后仍保持稳定的唯一ID
针对你的需求,不同平台(Android、桌面Java)有不同的实现方案,以下是无需依赖外部链接的实用解决方案:
Android平台
常见的ANDROID_ID会在设备重置后失效,推荐以下两种更稳定的方案:
1. 硬件标识符(需注意权限限制)
这类ID基于设备硬件,重置后不会改变,但获取权限在高版本Android中受限:
- IMEI/MEID:仅适用于带蜂窝模块的设备,Android 10+ 普通应用无法直接获取(需系统级权限)
import android.content.Context; import android.telephony.TelephonyManager; public String getIMEI(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { return tm.getImei(); } else { return tm.getDeviceId(); } } - 设备序列号:适用于平板等非蜂窝设备,Android 10+ 普通应用同样无法直接获取
import android.os.Build; public String getSerialNumber() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { return Build.getSerial(); } else { return Build.SERIAL; } }
2. 自定义持久化ID(无权限限制)
生成UUID并存储在应用私有外部目录,设备重置时若用户选择保留应用数据,ID不会丢失;卸载应用则ID失效:
import android.content.Context; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.UUID; public class DeviceIdHelper { private static final String DEVICE_ID_FILE = "device_id.txt"; public static String getPersistentDeviceId(Context context) { File file = new File(context.getExternalFilesDir(null), DEVICE_ID_FILE); if (file.exists()) { try (FileInputStream fis = new FileInputStream(file)) { byte[] buffer = new byte[(int) file.length()]; fis.read(buffer); return new String(buffer); } catch (IOException e) { e.printStackTrace(); } } String deviceId = UUID.randomUUID().toString(); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(deviceId.getBytes()); } catch (IOException e) { e.printStackTrace(); } return deviceId; } }
桌面Java平台
通过读取硬件信息生成ID,系统重置后不会改变,需做跨平台适配:
示例:读取Windows硬盘序列号
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.UUID; public class DesktopDeviceId { public static String getHardDiskId() { try { Process process = Runtime.getRuntime().exec("wmic diskdrive get serialnumber"); BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; int count = 0; while ((line = br.readLine()) != null) { count++; if (count == 2) { return line.trim(); } } } catch (Exception e) { e.printStackTrace(); } return UUID.randomUUID().toString(); // 获取失败时返回UUID作为备选 } }
注:Linux可使用hdparm -i /dev/sda,macOS可使用system_profiler SPSerialATADataType命令实现对应逻辑
注意事项
- 硬件ID的获取受系统版本和权限限制,需做好异常处理和权限申请流程
- 不存在绝对永久不变的ID:硬件更换、存储格式化、应用卸载等场景都会导致ID变化,需根据业务需求选择合适方案
内容的提问来源于stack exchange,提问作者Divya Patel
相关产品推荐
相关产品推荐

