|
记得长远之前正在一场笔试上有一道问题便是:“何如独一的标识一台Android筑立?”。当时只分明IMEI可能是用来标识一台手机的,因此就恣意填了上去,然后...就没有然后了...这日恰好正在使命中从头遭遇,就拿出来说说看。
起首说结论咱们事实能不行独一的标识一台Android筑立?很缺憾,目前没有一个很完备的设施不妨治理这个题目。Android开垦者博客的原文是:
UUID: (Universally Unique Identifier)全体独一标识符,是指正在一台机械上天生的数字,它确保对正在同偶然空中的一齐机械都是独一的。由以下几个人的组合:目今日期和年华(UUID的第一个个人与年华相合,即使你正在天生一个UUID之后,过几秒又天生一个UUID,则第一个个人区别,其余一样),时钟序列,全体独一的IEEE机械识别名(即使有网卡,从网卡得回,没有网卡以其他办法得回)。
IMEI: (International Mobile Equipment Identity) 是邦际搬动筑立身份码的缩写,邦际搬动配备辨识码,是由15位数字构成的电子串号,它与每台手机逐一对应,并且该码是全全邦独一的。
MEID:( Mobile Equipment IDentifier )是环球独一的56bit CDMA制式搬动终端标识号。标识号会被烧入终端里,而且不行被删改。可用来对CDMA制式搬动式筑立举行身份识别和跟踪。
两者的区别正在于:IMEI是手机的身份证,MEID是CDMA制式(电信运营的)的专用身份证;IMEI是15位,MEID是14位。
依据区别的手机筑立返回IMEI,MEID或者ESN码,可能依据以下代码得回:
非手机筑立:最入手搭载Android编制都手机筑立,而现正在也涌现了非手机筑立:如平板电脑、电视、音乐播放器等。这些筑立没有通话的硬件功用,编制中也就没有TELEPHONY_SERVICE,自然也就无法通过上面的设施得回DEVICE_ID。
厂商定制编制中的Bug:少数手机筑立上,因为该达成有缺点,会返回垃圾(这是开垦者博客的原话,没有践诺过)。
可能运用手机WiFi或蓝牙的MAC所在行动筑立标识,然而并不推选这么做,来由有以下两点:
硬件范围:并不是一齐的筑立都有WiFi和蓝牙硬件,硬件不存正在自然也就得不到这一音信。
获取的范围:即使WiFi没有掀开过,是无法获取其Mac所在的;而蓝牙是惟有正在掀开的功夫材干获取到其Mac所在。
硬件序列,正在Android 2.2 以上可能通过android.os.Build.SERIAL得回序列号。正在极少没有电话功用的筑立会供给,某些手机上也可以供给(因此便是时时会返回Unknown)
ANDROID_ID是筑立第一次启动时爆发和存储的64bit的一个数,当筑立被wipe后该数重置。
ANDROID_ID彷佛是获取Device ID的一个好拔取,但它也有缺陷:正在主流厂商临盆的筑立上,有一个很时时的bug,便是每个筑立都邑爆发一样的ANDROID_ID:9774d56d682e549c 。同时刷机,或者重置ANDROID_ID的值都邑变动。
正在措施安设后第一次运转时天生一个ID,该办法和筑立独一标识不雷同,区别的操纵措施会爆发区别的ID,统一个措施从头安设也会区别。因此这不是筑立的独一ID,然而可能确保每个用户的ID是区别的。 可能说是用来标识每一份操纵措施的独一ID(即Installtion ID),可能用来跟踪操纵的安设数目等(原来便是UUID)。
通过读取筑立的ROM版本号、厂商名、CPU型号和其他硬件音信来组合出一串15位的号码和筑立硬件序列号行动种子天生UUID。一串15位的号码(批量临盆的筑立每项音信根本一样,因此这一段一样的可以性独特高);硬件序列,正在极少没有电话功用的筑立会供给,某些手机上也可以供给(Devices without telephony are required to report a unique device ID here; some phones may do so also.),因此便是时时会返回Unknown。
起首通过读取Android_id,行动UUID的种子。若取得Android_Id等于9774d56d682e549c或者 产生毛病则random一个UUID行动备用计划,终末把取得的UUID同时存入内部存储和外部存储。下次运用UUID的功夫优先从外部存储读取,再从背部存储读取,终末正在从头天生,尽可以的确保其稳固性。
|
|