实际上,我正在开发一个android应用程序,希望为每个android设备捕获一个唯一的Id,但不确定哪个Id是可靠的。
电话号码Imei/imsi -启动android 10,第三方应用程序将无法检索此id,即使提供了许可。
安全ID -这个id是敏感的工厂重置,所以它是不可靠的。
序列号:有些手机有序列号,有些不可靠
UUID-由我们的应用程序生成,在每个新版本的安装过程中都会进行更改。
是否有任何唯一的Id不依赖于android版本,并且在工厂重置期间也不会更改?
发布于 2021-12-23 08:07:08
你可以用这个方法。我使用它,并在许多设备上取得了良好的效果。您可以通过调用亚行外壳getprop和读取任何唯一值来添加设备以外的其他内容。
参考资料:https://gist.github.com/flawyte/efd23dd520fc2320f94ba003b9aabfce
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 = (String) get.invoke(c, "ro.boot.serialno");
if (serialNumber.equals(""))
serialNumber = (String) get.invoke(c, "ro.ril.oem.sno");
if(serialNumber.equals(""))
serialNumber = (String) get.invoke(c, "ril.cdma.esn");
if(serialNumber.equals(""))
serialNumber = (String) get.invoke(c, "ro.boot.ap_serial");
if(serialNumber.equals(""))
serialNumber = (String) get.invoke(c, "ro.vendor.hon.imei.num");
if(serialNumber.equals(""))
serialNumber = (String) get.invoke(c,"ro.vendor.hon.extserial.num");
if (serialNumber.equals("")){
serialNumber= (String)get.invoke(c, "vendor.gsm.serial");
serialNumber = serialNumber.substring(0,serialNumber.indexOf(' '));
}
if(serialNumber.equals(""))
serialNumber = ((String)get.invoke(c,"ro.ril.oem.wifimac")).replace(":","");
if (serialNumber.equals(""))
serialNumber = ((String) get.invoke(c,"ro.ril.oem.btmac")).replace(":","");
if (serialNumber.equals(""))
serialNumber = Build.SERIAL;
if (serialNumber.equals(Build.UNKNOWN))
serialNumber = null;
} catch (Exception e) {
e.printStackTrace();
serialNumber = null;
}
return serialNumber;
}https://stackoverflow.com/questions/67270143
复制相似问题