Android唯一序列号
我正在开发一个Android应用程序,目标Android 4.0(API 14)及以上。
我正在寻找一个序列号,每个设备是唯一的,并永远坚持永远(与设备死亡,不会在工厂重置后更改)。
我在网上发现了很多关于android设备的唯一标识符的结果,但是在android.os.Build.SERIAL数字上却很less。
到目前为止,我没有使用ANDROID_ID,因为在出厂重置后它可能会改变。 我也消除了使用IMEI,因为Android设备可能是非手机。 我不能使用wifi或蓝牙MAC地址,因为设备可能没有这样的硬件和/或如果没有启用硬件(根据我在网上find的)硬件没有这样的MAC地址可读。
我相信我可能会去android设备的序列号。
使用android.os.Build.SERIAL可以轻松访问它(因为它是在API级别9中添加的,不需要任何额外的权限)。
我的问题是:
-
考虑到我的应用程序的目标是Android 4.0(API 14)及以上版本,Android设备的android.os.Build.SERIAL编号是唯一的每个设备?
-
目前, android.os.Build.SERIAL的文档显示: 硬件序列号(如果可用)。 仅字母数字,不区分大小写。 这是否意味着序列号可能不可用?
-
有什么可以作为符合上述条件的另一种select?
考虑到我的应用程序的目标是Android 4.0(API 14)及以上版本,Android设备的android.os.Build.SERIAL编号是唯一的每个设备?
根据Android Developers博客中的这篇有用的文章 ,如果可用, android.os.Build.SERIAL
应该是唯一的。 从文章:
没有电话的设备需要在这里报告唯一的设备ID; 有些手机也可能这样做。
这是否意味着序列号可能不可用?
正确的,它可能不可用。 注意,他们说“没有电话的设备是必需的…” ,所以只有没有“电话”的设备(如wifi only tablet)需要提供一个SERIAL
号,尽pipe一些电话仍然有效(如Nexus 4)。
关于这个话题肯定缺乏文档,但从措辞来看,可能只有“没有电话的设备”才需要提交一个唯一的ID,而提交一个的电话可能不是唯一的。
还有什么可以符合上述条件的呢?
对于你的情况,我认为你最好的select是首先检查deviceId
(IMEI,或不是),如果deviceId
不存在,那么你回deviceId
使用android.os.Build.SERIAL
(因为这可能是一个平板电脑)所以:
public static String getDeviceId(Context context) { final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); if (deviceId != null) { return deviceId; } else { return android.os.Build.SERIAL; } }
请记住使用deviceId
您需要权限android.permission.READ_PHONE_STATE
。
所以,因为你的应用程序的minSDK是14,你可以放心使用android.os.Build.SERIAL
字段。 如果我们假设没有电话的设备真的在SERIAL
总是提供唯一的id,那么我认为这将是一个总是得到唯一设备ID的安全赌注(当然,任何错误吧)。
我个人使用Secure.ANDROID_ID
& Build.SERIAL
来识别电话:
androidId = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID) + Build.SERIAL;
他们可能有相同的ANDROID_ID
,他们可能没有SERIAL
。 但是两者的机会都很低。
你似乎总结的情况很好。
序列号对于每个设备都是唯一的,但是(这是Android),当然有错误会产生exception,例如https://code.google.com/p/android/issues/detail?id=35193
正如你指出的那样,文档build议这是一个硬件序列号,但是措辞的方式表明你不应该指望这一点。 而且不要误以为设备的实际序列号,例如印在背面或盒子上的序列号。 同样,我相信它比android_id的使用要less得多,所以很有可能是没有报告的问题。
我已经看到广泛报道,android_id是基于序列号,但我认为这是不正确的 – 我最近观察到,在具有新的多用户function的平板电脑上,每个用户帐户都有自己的android_id,但是两个序列号是相同的。
AFAIK'另一种select'不存在:你的名单是完整的。 序列号是最接近你的东西,除非你准备依赖于WiFi或蓝牙的权限。
我通常通过做一些独特的string(公司名称通常)+ imei(如果没有imei,MAC地址[无线,蓝牙等])的SHA1哈希得到唯一的ID。 这给了我看起来相同的唯一ID,每个设备往往是唯一的(如果MAC改变/伪造,不完美)。