1. 程式人生 > >Android裝置唯一識別符號ID

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();
}