安卓获取序列号

7

我正在尝试通过编程的方式获取设备序列号。我已经使用了以下代码:

Build.SERIAL

返回的结果类似于:

95b9efad04ad28

但是当我进入设备的设置中,我发现它显示了一个不同的字符串:

enter image description here

有没有人能指导我正确的方向?


我使用运行在 4.4.2 上的 Lenovo S660,它返回了正确的值。你使用的是什么设备或版本? - Mithun
1
可能是如何查找Android设备的序列号?的重复问题。 - RvdK
6个回答

6

根据设备制造商和Android版本的不同,有几种获取该数字的方法:

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;
}

引用自此处Gist


1
无法在Android 10上工作,Android 10增加了限制。请参考https://developer.android.com/about/versions/10/privacy/changes#non-resettable-device-ids。 - Qamar

4
这对我有用:
String serialNumber;

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

    serialNumber = (String) get.invoke(c, "sys.serialnumber", "error");
    if (serialNumber.equals("error")) {
        serialNumber = (String) get.invoke(c, "ril.serialnumber", "error");
    }
} catch (Exception e) {
    e.printStackTrace();
}

0
我正在尝试以编程方式获取设备序列号。
这个功能在安卓上已经破损了很久。一些设备返回null,一些设备返回相同的ID等。如果您的应用程序正在使用Google Play服务,请改用InstanceId,或者参见这篇古老但仍然有效的博客文章

0

这不是你的答案吗?:

TelephonyManager tManager = (TelephonyManager)myActivity.getSystemService(Context.TELEPHONY_SERVICE);
String uid = tManager.getDeviceId();

我在这里找到了它。


很遗憾,不行。我尝试过了,但它返回空值。这是一款平板电脑,所以不确定是否有影响。 - James King

0

由于许多设备和 Android 构建中的 Android ID 都已损坏,因此我正在使用 Android ID 和设备 WIFI-MAC 地址的混合,后者对于每个设备都是唯一的。

两者都用于创建 UUID,无论 Android ID 是否为空,UUID 都始终是唯一的。

可以尝试类似以下内容:

final WifiManager wm = (WifiManager) myAct.getSystemService(Context.WIFI_SERVICE);
String macAddr = null;
if (wm != null)
    macAddr = wm.getConnectionInfo().getMacAddress();
String androidId = Secure.getString(myAct.getContentResolver(), Secure.ANDROID_ID);

if (androidId == null)
    androidId = "0000000000000000";

if (macAddr == null || macAddr.contains("\\s+") || !macAddr.contains(":"))
    macAddr = "00:00:00:00:00:00";

UUID deviceUuid = new UUID(macAddr.hashCode(), androidId.hashCode());
String deviceId = deviceUuid.toString();

0

我知道这个问题已经过了几年了,但我想发布一个更新版本,特别是针对那些可能正在使用Xamarin的人。这是适用于C# Xamarin Android的解决方案,基于用户flawyte上面发布的解决方案。

以下是代码:

public static string GetDeviceSerialCode ( )
{
    string serial_number = string.Empty;

    try
    {
        var c = Java.Lang.Class.ForName("android.os.SystemProperties");
        var get = c.GetMethod("get", Java.Lang.Class.FromType(typeof(Java.Lang.String)));

        serial_number = (string)get.Invoke(c, "gsm.sn1");
        if (string.IsNullOrEmpty(serial_number))
        {
            serial_number = (string)get.Invoke(c, "ril.serialnumber");
        }
        if (string.IsNullOrEmpty(serial_number))
        {
            serial_number = (string)get.Invoke(c, "ro.serialno");
        }
        if (string.IsNullOrEmpty(serial_number))
        {
            serial_number = (string)get.Invoke(c, "sys.serialnumber");
        }
        if (string.IsNullOrEmpty(serial_number))
        {
            serial_number = Build.GetSerial();
        }
    }
    catch (Exception e)
    {
        serial_number = string.Empty;
    }

    return serial_number;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接