tha*_*sma 75

这是硬件序列号.要访问它

它对任何设备都是独一无二的.如果您正在寻找如何获取/使用唯一设备ID的可能性,请阅读此处.

对于涉及反射而无需许可的解决方案,请参阅此答案.

  • 为什么你说它在出厂重置时会改变?我知道对于Settings.Secure.ANDROID_ID也是如此,但我没有听说过Build.Serial. (3认同)
  • 这通常与制造商在设备上实际打印的序列号相同,还是仅为软件的序列号? (2认同)
  • 此答案的编辑方式应与Android 8(API26)相同,并且在Build.SERIAL以上版本将不起作用。获取序列号的唯一方法是调用需要READ_PHONE_STATE权限的Build.getSerial()方法。 (2认同)

pat*_*ckf 45

在Android 7.1(SDK 25)之前,您将获得:

Build.SERIAL
Run Code Online (Sandbox Code Playgroud)

请注意Android 8(SDK 26)及更高版本,此字段将返回UNKNOWN,必须使用以下命令访问:

Build.getSerial()
Run Code Online (Sandbox Code Playgroud)

这需要危险的许可 android.permission.READ_PHONE_STATE.

请参阅https://developer.android.com/reference/android/os/Build.html#getSerial()

  • 很酷,我把投票改为投票. (2认同)

fla*_*yte 17

Build.SERIAL 可以为空,或者有时返回与设备设置中看到的值不同的值(证明1证明2)。

如果您想要一个更完整,更强大的解决方案,那么我将在一个要点中找到所有可能的解决方案。这是它的简化版本:

public static String getSerialNumber() {
    String serialNumber;

    try {
        Class<?> c = Class.forName("android.os.SystemProperties");
        Method get = c.getMethod("get", String.class);

        serialNumber = (String) get.invoke(c, "gsm.sn1");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ril.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ro.serialno");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "sys.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = Build.SERIAL;

        // If none of the methods above worked
        if (serialNumber.equals(""))
            serialNumber = null;
    } catch (Exception e) {
        e.printStackTrace();
        serialNumber = null;
    }

    return serialNumber;
}
Run Code Online (Sandbox Code Playgroud)

每当我可以在新设备或Android版本上进行测试时,我都会定期更新要点。也欢迎捐款。