【发布时间】:2016-01-09 20:24:11
【问题描述】:
我正在尝试以编程方式获取设备序列号。我使用了以下行:
Build.SERIAL
返回类似:
95b9efad04ad28
但是我去设备上的设置,我可以看到它显示一个不同的字符串:
谁能指出正确的方向?
【问题讨论】:
-
我使用
Lenovo S660在4.4.2上运行,它返回正确的值。您使用的是什么设备或版本?
我正在尝试以编程方式获取设备序列号。我使用了以下行:
Build.SERIAL
返回类似:
95b9efad04ad28
但是我去设备上的设置,我可以看到它显示一个不同的字符串:
谁能指出正确的方向?
【问题讨论】:
Lenovo S660 在4.4.2 上运行,它返回正确的值。您使用的是什么设备或版本?
我知道这个问题已经有好几年了,但我想发布一个更新版本,特别是对于那些可能正在使用 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;
}
【讨论】:
根据设备的制造商和 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。
【讨论】:
这对我有用:
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();
}
【讨论】:
由于 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();
【讨论】:
我正在尝试以编程方式获取设备序列号
此功能在 Android 上已被破坏多年。一些设备返回null,一些设备返回相同的ID 等所有设备。如果您的应用使用Google Play 服务,请改用InstanceId,或者看到这个,但现在很古老,但仍然有效,blog post。
【讨论】:
这不是你的答案?:
TelephonyManager tManager = (TelephonyManager)myActivity.getSystemService(Context.TELEPHONY_SERVICE);
String uid = tManager.getDeviceId();
我在here找到它
【讨论】: