Android唯一序列号

Lee*_*elo 52 android serial-number uniqueidentifier

我正在开发一个针对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的文档指示:硬件序列号(如果可用).仅限字母数字,不区分大小写. 这是否意味着序列号可能不可用?

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

Ton*_*han 54

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

根据Android开发者博客中的这篇有用的文章,如果它可用,android.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住使用deviceId您需要的权限android.permission.READ_PHONE_STATE.

因此,由于您的应用程序的minSDK为14,您可以安全地使用该字段android.os.Build.SERIAL.如果我们假设没有电话的设备真的总是提供独特的ID,SERIAL那么我认为这是一个安全的赌注,总是得到一个独特的设备ID(当然,任何错误).


Kai*_*ang 9

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

androidId = Settings.Secure.getString(this.getContentResolver(), 
                Settings.Secure.ANDROID_ID) + Build.SERIAL;
Run Code Online (Sandbox Code Playgroud)

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

  • 问题是,如果用户进行出厂重置,您使用`Secure.ANDROID_ID`获得的值可能会改变,这意味着您的连接ID也会发生变化,即使它仍然是同一个设备. (3认同)
  • 似乎这是一个解决方案.我需要将每个设备的一些静态唯一字符串发送到我的服务器api以注册用户.它的解决方案不需要任何插件权限.喜欢它! (2认同)

Tom*_*Tom 5

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

序列号在每个设备上都是唯一的,但是(这是Android)当然会存在一些会引起异常的错误,例如 https://code.google.com/p/android/issues/detail?id=35193

正如您所指出的那样,文档建议这旨在用作硬件序列号,但是其措辞表明您不应依赖此序列号。请勿将其误认为设备的实际序列号,即印在背面或盒子上的序列号。同样,我认为它的使用范围比android_id少得多,因此很可能存在未报告的问题。

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

AFAIK“另一个替代方案”不存在:您的列表已完成。序列号是最接近您的序列号,除非您准备依赖wifi或蓝牙权限。

  • 您是正确的,`android_id`不是基于序列号。显然,它只是基于随机数生成器。当他们最终修复了许多设备具有以下问题的错误时,请查看他们在[此处](https://android.googlesource.com/platform/frameworks/base/+/9bb4ec484b9b9518bf5b17484dcb50727c58b5d1%5E%21/#F0)所做的代码更改。相同的“ android_id”。 (3认同)