53

我正在开发一个针对 Android 4.0 (API 14) 及更高版本的 Android 应用程序。

我正在寻找每个设备唯一且永远存在的序列号(与设备一起死亡,恢复出厂设置后不会更改)。

我在网上找到了很多关于 android 设备唯一标识符的结果,但在android.os.Build.SERIAL编号上却很少。

到目前为止,我消除了ANDROID_ID的使用,因为它可能会在恢复出厂设置后发生变化。我还取消了IMEI的使用,因为 android 设备可能不是电话。我无法使用 wifi 或蓝牙MAC 地址,因为设备可能没有此类硬件和/或如果未启用硬件(基于我在网上找到的内容),此类 MAC 地址可能无法读取。

我相信我可能会选择 android 设备序列号。

使用android.os.Build.SERIAL可以轻松访问它(因为它是在 API 级别 9 中添加的,不需要任何额外的权限)。

我的问题是:

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

  • 目前,android.os.Build.SERIAL的文档表明:硬件序列号,如果有的话。仅字母数字,不区分大小写。 这是否意味着序列号可能不可用?

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

4

4 回答 4

56

考虑到我的应用程序针对 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;
    }
}

请记住使用deviceId您需要许可android.permission.READ_PHONE_STATE

因此,由于您的应用的 minSDK 为 14,因此您可以安全地使用该字段android.os.Build.SERIAL。如果我们假设没有电话的设备确实总是提供唯一的 ID,SERIAL那么我认为这将是始终获得唯一设备 ID 的安全赌注(当然排除任何错误)。

于 2013-06-05T00:26:32.163 回答
11

我个人使用Secure.ANDROID_ID&Build.SERIAL来识别电话:

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

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

于 2016-01-27T22:31:34.230 回答
5

You appear to have summarized the situation pretty well.

The serial number is intended to be unique for each device, but (this being Android) there are of course bugs that create exceptions, e.g. https://code.google.com/p/android/issues/detail?id=35193

As you point out, the docs suggest that this is intended to be a hardware serial number, but the way it is worded suggests that you shouldn't count on that. And don't mistake that for the device's actual serial number, i.e. the serial number printed on the back or on the box. As well, I believe it is much less widely used than android_id, so there could well be issues that are not reported.

I've seen it widely reported that the android_id is based on the serial number, but I believe that is not true - I recently observed that, on a tablet with the new multi-user capability, each user account gets its own android_id but the serial number is the same for both.

AFAIK 'another alternative' does not exist: your list is complete. The serial number is the closest thing to what you are after unless you are prepared to depend on wifi or bluetooth permissions.

于 2013-05-07T00:19:40.323 回答
0

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

于 2013-05-07T00:26:10.997 回答