一、前言
在开发中,我们有时候会遇到获取Android设备的唯一标识,唯一标识必须满足两个特性才能完美解决定位唯一设备的问题:
(1)唯一性:标识必须在所有使用该应用的设备上保持唯一性
(2)不变性:标识必须在同一设备上保持不变
二、使用硬件标识
硬件标识实际上在硬件生产之时就被要求满足这两个特性(依然有人工生产的不确定性),所以,在过去,这是一种很常用的方案,但如今硬件标识的获取趋于困难性,使得使用硬件标识作为唯一识别码的方案所能使用的范围越来越狭窄,官方也不推荐使用这种方式。
2.1 IMEI
IMEI 国际移动设备身份码 目前GSM/WCDMA/LTE手机终端需要使用IMEI号码,在单卡工程中一个手机号对应一个IMEI号,双卡手机则会对应两个IMEI号,一张是手机卡对应一个。
需要权限
val imei = context.getSystemService(context.TELEPHONY_SERVICE).deviceId
缺点
- 由以上可以看出使用IMEI来作为Android的设备唯一标识符存在一定的弊端,如果APP未涉及电话功能,却要申请电话权限涉及隐私问题,如果用户禁用掉相关权限,将获取不到。
- Android 10以后 需要
READ_PRIVILEGED_PHONE_STATE
权限才能访问,这个权限为厂商拥有的权限,普通app没有这个权限,所以取到的为null。
2.2 ANDROID_ID
在设备首次运行的时候,系统会随机生成一64位的数字,并把这个数值以16进制保存下来,这个16进制的数字就是ANDROID_ID,但是如果手机恢复出厂设置这个值会发生改变,如果设备被root,这个值可以任意改变。
val androidID = Secure.getString(context.contentResolver, Secure.ANDROID_ID)
缺点
- 手机恢复出厂设置以后该值会发生变化
- 在国内Android定制的大环境下,有些设备是不会返回ANDROID_ID的