Android唯一序列号

时间:2013-04-18 08:41:21

标签: android uniqueidentifier 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 的文档表明:硬件序列号(如果有)。仅限字母数字,不区分大小写。 这是否意味着序列号可能不可用?

  • 什么是满足上述条件的另一种选择?

4 个答案:

答案 0 :(得分:54)

  

考虑到我的应用程序针对Android 4.0(API 14)及更高版本,是每个设备唯一的android设备的android.os.Build.SERIAL数字吗?

根据Android开发者博客中这个有用的articleandroid.os.Build.SERIAL 应该是唯一的(如果可用)。 来自文章:

无电话设备需要在此处报告唯一的设备ID;有些手机也可以这样做。

  

这是否意味着序列号可能无法使用?

正确,可能无法使用。请注意,他们说“不需要电话的设备......”,所以只有没有“电话”的设备(如仅限wifi的平板电脑)需要提供SERIAL号码,尽管有些手机仍然(如Nexus 4)。

这个主题肯定缺乏文档,但从措辞来看,只有“没有电话的设备”才能提交唯一ID,而提交一个ID的电话可能不是唯一的。

  

什么是满足上述条件的另一种替代方案?

根据您的情况,我认为您最好的选择是首先检查deviceId(IMEI,或不是),如果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(当然,任何错误)。

答案 1 :(得分:9)

我个人使用Secure.ANDROID_ID& Build.SERIAL识别手机:

androidId = Settings.Secure.getString(this.getContentResolver(), 
                Settings.Secure.ANDROID_ID) + Build.SERIAL;

他们可能具有相同的ANDROID_ID,但他们可能没有SERIAL。但两者的可能性都很低。

答案 2 :(得分:4)

您似乎已经很好地总结了这种情况。

序列号对于每个设备都是唯一的,但是(这是Android)当然存在创建例外的错误,例如 https://code.google.com/p/android/issues/detail?id=35193

正如您所指出的那样,文档建议这是一个硬件序列号,但它的措辞方式表明您不应该依赖它。并且不要将其误认为是设备的实际序列号,即打印在背面或盒子上的序列号。同样,我相信它的使用范围远不如android_id,因此可能会出现未报告的问题。

我已经看到它广泛报道android_id是基于序列号,但我认为这不是真的 - 我最近观察到,在具有新的多用户功能的平板电脑上,每个用户帐户都有自己的android_id,但两者的序列号相同。

AFAIK'另一种选择'不存在:您的列表已完成。除非您准备依赖wifi或蓝牙权限,否则序列号与您所追求的最接近。

答案 3 :(得分:0)

我通常通过执行某个唯一字符串(通常是公司名称)+ imei(如果没有imei,mac地址[wifi,蓝牙等])的SHA1哈希来获得唯一ID。这给了我看起来相同的唯一ID,每个设备往往是唯一的(如果MAC被改变/伪造,则不完美)。