安卓设备没有唯一性可言,根据需求选择使用不同的标示符或组合方式。
- 需要权限:
- IMEI:(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备识别码,是由15位数字组成的"电子串号",它与每台手机一一对应,而且该码是全世界唯一的,每一只手机在组装完成后都将被赋予一个全球唯一的一组号码。
- 机身上的设备号#06#
- 设备ID(DeviceId),非电话设备或者 Device ID 不可用时,返回 null 。
- 需要 READ_PHONE_STATE 权限。(危险权限)
- 某些设备上该方法存在Bug,返回的结果可能是一串0或者一串*号。
- 强制刷错我的刷机包等方式能更改。
- IMSI:(InternationalMobileSubscriberIdentificationNumber)国际移动用户识别码,是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。其总长度不超过15位,同样使用0~9的数字。
- Mac地址:
- 没有 WiFi 硬件或者 WiFi 不可用的设备可能返回 null 或空,注意判空.
- 比较稳定的硬件标识符。
- 需要 ACCESS_WIFI_STATE 权限。(普通权限)
- Android 6.0开始,谷歌为保护用户数据,用此方法获取到的 Wi-Fi mac 地址都为02:00:00:00:00:00。
- 如果 app 在装有谷歌框架的设备中读取了mac地址,会被谷歌检测为有害应用提示用户卸载。这也是为什么像友盟、TalkingData 等数据统计 sdk 提供商专门针对 Google Play 提供特供版的 sdk.
- Sim序列号:
- 当手机上装有 Sim 卡并且可用时,返回该值。手机未装 Sim 卡或者不可用时,返回 null.
- 需要 READ_PHONE_STATE 权限
- IMEI:(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备识别码,是由15位数字组成的"电子串号",它与每台手机一一对应,而且该码是全世界唯一的,每一只手机在组装完成后都将被赋予一个全球唯一的一组号码。
- 不需要权限:
- Android_ID:
- 在设备第一次启动的时候生成并保存,并且可能会在恢复出厂设置后重置该值。理论上是大部分是重置的。
- 在 Android 2.2 中不可靠.
- 部分设备由于制造商错误实现,导致会返回相同的 Android_ID:9774d56d682e549c
- 在 Android 4.2 及以上, 设备启用多用户功能后,每个用户的 Android_ID 不相同.
- UUID:在程序安装后第一次运行时生成一个ID,该方式和设备唯一标识不一样,不同的应用程序会产生不同的ID,同一个程序重新安装也会不同。所以这不是设备的唯一ID,但是可以保证每个用户的ID是不同的。可以说是用来标识每一份应用程序的唯一ID(即Installtion ID),可以用来跟踪应用的安装数量等。
- Android_ID:
解决办法:
- 目前的解决办法,比较可行的是一一适配,在保证大多数设备方便的前提下,如果获取不到,使用其他备选信息作为标识,即自己再封装一个设备ID出来,通过内部算法保证尽量和设备硬件信息相关,以及标识的唯一性。