記錄一次安卓設備唯一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 等來計算生成設備的標識符