【问题标题】:Android get Serial Number安卓获取序列号
【发布时间】:2016-01-09 20:24:11
【问题描述】:

我正在尝试以编程方式获取设备序列号。我使用了以下行:

Build.SERIAL

返回类似:

95b9efad04ad28

但是我去设备上的设置,我可以看到它显示一个不同的字符串:

谁能指出正确的方向?

【问题讨论】:

标签: java android


【解决方案1】:

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

代码如下:

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

【讨论】:

    【解决方案2】:

    根据设备的制造商和 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;
    }
    

    取自this gist

    【讨论】:

    【解决方案3】:

    这对我有用:

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

    【讨论】:

      【解决方案4】:

      由于 Android ID 在许多设备上被破坏并且 Android 构建相似,我使用 Android ID 和设备 WIFI-MAC 地址的混合,每个设备都是唯一的。 两者都用于创建 UUID,无论 Android ID 是否为空,它始终是唯一的。

      尝试类似的方法:

      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();
      

      【讨论】:

        【解决方案5】:

        我正在尝试以编程方式获取设备序列号

        此功能在 Android 上已被破坏多年。一些设备返回null,一些设备返回相同的ID 等所有设备。如果您的应用使用Google Play 服务,请改用InstanceId,或者看到这个,但现在很古老,但仍然有效,blog post

        【讨论】:

          【解决方案6】:

          这不是你的答案?:

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

          我在here找到它

          【讨论】:

          • 遗憾的是没有。我试过这个,但它返回null。这是平板电脑,所以不确定这是否会有所不同
          猜你喜欢
          • 2011-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多