我有一个应用程序,它检查Build.SERIAL返回的值,然后在应用程序和网站之间传输数据时将其用作一种验证。除了偶尔用户无法连接外,一切正常。在文档中,它说Build.SERIAL返回序列号如果可用,我的问题是这是否意味着某些设备将拥有它而某些设备不会,或者它是否意味着设备可能能够在某些时候检索它,而其他人则不会检索它?
我假设它是第一个,但我有用户遇到问题,我不能重复它。当我尝试搜索更多关于“如果可用”的含义的信息时,我真的找不到任何东西。
编辑为了进一步澄清,我有一个具有序列号的用户,可以正常使用该软件。问题是偶尔他会收到一个错误,说序列号没有注册,我无法重新创建问题所以我只是猜测设备有时不会获取序列号。我想知道是否有人可以确认这是否是一个问题。如果再次发生错误,我已经提出了一些措施来捕捉错误,但它似乎是随机发生的。
编辑2 所以我发现Build.serial仍然返回序列号,所以这不是问题,生病最终搞清楚了,但是现在我只是留下这个问题直到有人可以解释它何时可用或不可用,以防将来帮助某人。
答案 0 :(得分:1)
Build.SERIAL
can be empty,或者有时返回的值(proof 1,proof 2)不同于您在设备设置中看到的值。
有多种方法可以获取该数字,具体取决于设备的制造商和Android版本,因此我决定在一个gist中编译可以找到的所有可能的解决方案。这是它的简化版本:
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;
}
只要能在新设备或Android版本上进行测试,我都会定期更新要点。也欢迎捐款。