Android Unique Serial Number
我正在开发一个针对Android 4.0(API 14)及更高版本的Android应用程序。
我正在寻找一个每个设备唯一的序列号,并且这个序列号永远存在(与设备一起死亡,在出厂重置后不会改变)。
我在网上发现了很多关于Android设备的唯一标识符的结果,但在android.os.Build.SERIAL数字上却很少。
到目前为止,我已经消除了ANDROID_ID的使用,因为它可能会在出厂重置后发生变化。我也消除了IMEI的使用,因为Android设备可能是非手机的。我无法使用wifi或蓝牙MAC ADDRESS,因为如果未启用硬件(基于我在网络上找到的内容),设备可能没有这样的硬件和/或这样的mac地址可能无法读取。
我相信我可能会去Android设备序列号。
可以使用android.os.Build.SERIAL轻松访问它(因为它是在API级别9中添加的,不需要任何其他权限)。
我的问题是:
-
考虑到我的应用程序针对Android 4.0(API 14)及更高版本,是每个设备唯一的android设备的android.os.Build.SERIAL号码吗?
-
目前,android.os.Build.SERIAL的文档指示:硬件序列号(如果可用)。仅限字母数字,不区分大小写。
这是否意味着序列号可能不可用? -
什么是满足上述条件的另一种替代方案?
Taking into consideration that my application targets Android 4.0 (API 14) and above, is the android.os.Build.SERIAL number for the android devices unique for each device ?
根据Android开发人员博客中的这篇有用的文章,如果
来自文章:
没有电话的设备需要在此报告唯一的设备ID;有些手机也可以这样做。
Does this mean that the serial number might not be available ?
正确,可能无法使用。请注意,他们说"需要没有电话的设备......",所以只有没有"电话"的设备(如仅限wifi的平板电脑)需要提供
这个主题肯定缺乏文档,但从措辞来看,只有"没有电话的设备"才能提交唯一ID,而提交一个ID的电话可能不是唯一的。
What could be another alternative that meets the conditions mentioned above ?
对于你的情况,我认为你最好的选择是首先检查
1 2 3 4 5 6 7 8 | 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; } } |
请记住使用
因此,由于您的应用程序的minSDK为14,因此您可以安全地使用字段
我个人使用
1 2 | androidId = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID) + Build.SERIAL; |
它们可能具有相同的
您似乎已经很好地总结了这种情况。
序列号对于每个设备都是唯一的,但是(这是Android)当然存在创建例外的错误,例如
https://code.google.com/p/android/issues/detail?id=35193
正如您所指出的,文档表明这是一个硬件序列号,但它的措辞方式表明您不应该依赖它。并且不要将其误认为是设备的实际序列号,即打印在背面或盒子上的序列号。同样,我相信它的使用范围远不如android_id,因此可能会出现未报告的问题。
我已经看到它广泛报道android_id是基于序列号,但我认为这不是真的 - 我最近观察到,在具有新的多用户功能的平板电脑上,每个用户帐户都有自己的android_id但是序列号对于两者都是相同的。
AFAIK"另一种选择"不存在:您的列表已完成。除非您准备依赖wifi或蓝牙权限,否则序列号是您最接近的内容。
我通常通过做一些独特字符串(通常是公司名称)+ imei(如果没有imei,mac地址[wifi,蓝牙等])的SHA1哈希获得唯一ID。这给了我看起来相同的唯一ID,每个设备往往是唯一的(如果MAC被改变/伪造,则不完美)。