獲取手機的唯一標識
1.the imei:這個只是對Android手機有效
TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDeviceId();
運用這個方法,需要在mainfset裡面加入一個許可,android.permission.READ_PHONE_STATE
2.Pseudo_Unique ID
有時候,一些沒有通話功能的平板電腦,,或者你不願意加入READ_PHONE_STATE許可,如果要獲取唯一序列號之類的東西,可以用builder類
String szDevID="35"+
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.MANUFACTURE.length()%10+
Build.MODEL.length()%10+
Build.PRODUCT.length()%10 +
Build.TAGS.length()%10 +
Build.TYPE.length()%10 +
Build.USER.length()%10 ;
這樣一共13個數字,並且在前面加上”35”.這樣看起來就和15個IMEI一樣了.
3 The Android ID
通常被認為是不可信的,因為它有時為空,這個ID是會改變的,如果手機被Root的話,是可以被任意改變的.
Sting sz_AndroidID=Secure.getString(getContentResolver(),Secure.ANDROID_ID);
4 The WLAN MAC Address string
是另一個唯一的ID.這個是需要在註冊檔案里加入一個許可權,android.permission.ACCESS_WIFI_STATE
WifiManager wm=(WifiManager)getSystemService(Context.WIFI_SERVICE);
String sz_WlanMac=wm.getConnectionInfo().getMacAddress();
Returns: 00:11:22:33:44:55 (這不是一個真實的地址。而且這個地址能輕易地被偽造。).WLan不必開啟,就可讀取些值。
5.The BT MAC Address string
只在有藍芽的裝置上執行,並且要加入android.permission.BLUETOOTH 許可權
BluetoothAdapter m_BluetoothAdapter = null ; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
Returns: 43:25:78:50:93:38 . 藍芽沒有必要開啟,也能讀取。
Combined Device ID
綜上所述,一共有5個方法來獲取裝置的唯一標識,他們中有的可能會返回null,或者由於硬體缺失,許可權問題獲取失敗.
但總能獲得至少一個能用的,所以最好的方法就是通過拼接,或者拼接後的計算出的MD5值產生一個結果
String m_szLongID=szImei +szDevID+sz_AndroidID+sz_WlanMac+m_szBTMAC ;
// compute md5
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
m.update(m_szLongID.getBytes(),0,m_szLongID.length());
// get md5 bytes
byte p_md5Data[] = m.digest();
// create a hex string
String m_szUniqueID = new String();
for (int i=0;i<p_md5Data.length;i++) {
int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper padding)
if (b <= 0xF)
m_szUniqueID+="0";
// add number to string
m_szUniqueID+=Integer.toHexString(b);
} // hex string to uppercase
m_szUniqueID = m_szUniqueID.toUpperCase();
通過以上演算法,可以產生32位的16進位制資料
9DDDF85AFF0A87974CE4541BD94D5F55