You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:32:54