安卓设备唯一ID的坑

时间:2024-02-20 21:22:27

                                                  记录一次安卓设备唯一ID引发的追溯


事情的起因是什么呢,是在后台统计的时候发现同一个账号对应了多个所谓的deviceid,定位到以下几方面:

1、确实同一个账号在不同的设备玩过

2、在模拟器上进行手机设置会造成传入的ID不同

3、然后呢后面进入了下面链接的知识点,只罗列重点概念,一些介绍性的文字我就不写了,可以自己看链接内容

  参考文章:https://www.jianshu.com/p/59440efa020c

 

 

安卓下获取设备的唯一标识实在是太零散琐碎了,先要知道 IMEI、IMED、ESN、IMSI、android_id以及Serial Number。

1、IMEI总长为15位,每位数字仅使用0~9的数字,至于具体的组成这里就不写了,反正也记不住,需要注意的是双卡的手机有两个IMEI号码

2、MEID是全球唯一的56bit移动终端标识号,标识号会被烧入终端里,并且不能被修改MEID由14个十六进制数字标识,第15位为校验位,不参与空中传输,MEID号码的查看,目前没有一个通用的方法,由各手机制造商自己设置

3、ESN电子序列号,在CDMA 系统中,是鉴别一个物理硬件设备唯一的标识,随着CDMA移动设别的增多,ESN已经不够用了,所以推出了位数更多的MEID。。。所以呢这个可以不用管了

4、IMSI 是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息,IMSI总长度不超过15位,同样使用0~9 的数字。其中MCC是移动用户所属国家代号,占3位数字,中国的MCC规定为460。。。。这个可以记忆一下

5、ANDROID_ID android设备的唯一识别码,在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。

6、Serial Number 串号,略过

7、Sim Serial Number 手机SIM卡唯一标识

 

下面是一些具体代码:

1、DEVICE_ID,不同的手机设备返回IMEI,MEID或者ESN码,这是Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且唯一性良好

但是获取DEVICE_ID需要READ_PHONE_STATE权限,如果用户拒绝了权限,那么是拿不到IMEI值的,需要做特定处理

// DEVICE_ID可以同通过下面的方法获取,主要在安卓6之后建议分使用getImei()和getMeid()这两个方法得到相应的值
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);`
String DEVICE_ID = tm.getDeviceId();`

//
TelephonyManager可以得到的其他的一些值
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

 String deviceId = tm.getDeviceId();//不同的手机设备返回IMEI,MEID或者ESN码
 String imei = tm.getImei();//返回IMEI
 String meid = tm.getMeid();//返回MEID
 String simSerialNumber = tm.getSimSerialNumber();//手机SIM卡唯一标识 
 String subscriberId = tm.getSubscriberId();//返回例如独特的用户ID,一个GSM手机的号码。
 String line1Number = tm.getLine1Number();//手机号码

// 安卓ID,这个值鉴于不同厂商的处理不同,所以有潜在问题
String ANDROID_ID = Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);

2、手机SIM卡唯一标识
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    String SimSerialNumber = tm.getSimSerialNumber();
推荐使用Android_ID和Sim Serial Number。另外可以加上Device_ID,通过 UUID 或者 MD5 等来计算生成设备的标识符