Android裝置唯一識別符號ID
一、獲取各種單一的裝置標識方式
1、DEVICE_ID
概念:是區別移動裝置的標誌,儲存在移動裝置中,可用於監控被竊或無效的移動裝置。
優點:根據不同的手機裝置返回IMEI,MEID或者ESN碼,唯一性良好
缺點:由於獲取該唯一值,需要android.peimision.READ_PHONE_STATE,如果裝置沒有通話功能就返回為null
關鍵程式碼:
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
測試結果:小米HM note Android4.4.4 能正常獲取該ID
華為H60-L03 Android4.4.2 能正常獲取該ID
三星Galaxy S5 Android5.0 能正常獲取該ID
2、WIFI MAC 概念:獲取手機wifi的Mac地址作為唯一標識 優點: 缺點:如果裝置沒有支援WIFI的硬體,就返回null 關鍵程式碼: WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo().getMacAddress(); String wifiMac = info.getMacAddress(); 測試結果:小米HM note Android4.4.4 能正常獲取該ID 華為H60-L03 Android4.4.2 能正常獲取該ID 三星Galaxy S5 Android5.0 能正常獲取該ID 3、BlueTooth MAC 概念:獲取手機的藍芽Mac地址作為唯一裝置標識 優點: 缺點:如果裝置沒有支援藍芽的硬體,就返回null 關鍵程式碼: BluetoothAdapter btAdapter = null; //本地藍芽介面卡 btAdapter = BluetoothAdapter.getDefaultAdapter(); String btMacAddress = btAdapter.getAddress(); 測試結果:小米HM note Android4.4.4 能正常獲取該ID 華為H60-L03 Android4.4.2 能正常獲取該ID 三星Galaxy S5 Android5.0 能正常獲取該ID 4、SIM Serial Number 概念:SIM卡的序列號 優點: 缺點:沒有SIM卡就返回null 對於CDMA裝置,返回null 關鍵程式碼: TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); String sn = tm.getSimSerialNumber(); 測試結果:小米HM note Android4.4.4 有裝SIM卡 能正常獲取該ID 華為H60-L03 Android4.4.2 沒有SIM卡 返回ID為null 三星Galaxy S5 Android5.0 沒有SIM卡 返回ID為null 5、利用裝置各個硬體拼接出一個ID 概念:裝置內的每個硬體都有一個名稱,利用名稱的長度的個位數組合成一個裝置標識ID 優點:非手機裝置也可以通過該介面獲取ID 缺點:統一型號的裝置出現相同ID的可能性比較大 關鍵程式碼: String DevIDShort = "35" + //頭部加上"35",這樣這個ID看起來就和15位IMEI一樣了 Build.BOARD.length() % 10 + Build.BRAND.length() % 10 + Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 + Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 + Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 + Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 + Build.TAGS.length() % 10 + Build.TYPE.length() % 10 + Build.USER.length() % 10; 測試結果:小米HM note Android4.4.4 能正常獲取該ID 華為H60-L03 Android4.4.2 能正常獲取該ID 三星Galaxy S5 Android5.0 能正常獲取該ID 6、Android_ID 概念:當裝置首次啟動時,系統會隨機生成一個64位的數字,並把這個數字以16進位制字串的形式儲存下來 優點: 缺點:由於廠商定製的Bug,不同的裝置可能會產生相同的ANDROID_ID或返回值為null Andorid手機被Root過的話,這個ID也可以被任意改變 關鍵程式碼: String androidID = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); 測試結果:小米HM note Android4.4.4 能正常獲取該ID 華為H60-L03 Android4.4.2 能正常獲取該ID 三星Galaxy S5 Android5.0 能正常獲取該ID 7、Serial Number 概念:Android系統2.3版本以上可以獲取硬體Serial Number 優點:非手機裝置也可以通過該介面獲取ID 缺點: 關鍵程式碼: String sn = android.os.Build.SERIAL; 測試結果:小米HM note Android4.4.4 能正常獲取該ID 華為H60-L03 Android4.4.2 能正常獲取該ID 三星Galaxy S5 Android5.0 能正常獲取該ID
二、自定義一個裝置標識ID
問題分析:由於Android並沒有一個統一靠譜的裝置標識,所以我就參考騰訊的做法,自定義一個裝置標識ID。
演算法邏輯:利用上面獲取的各個方式的標識ID,拼接成一個字串,再利用訊息摘要,生成MD5值作為裝置標識ID
關鍵程式碼:
public static String encryptMD5(byte[] data) throws NoSuchAlgorithmException{
MessageDigest md5 = MessageDigest.getInstance(“MD5”);
md5.update(data);
byte[] resultBytes = md5.digest();
return resultBytes.toString();
}