1. 程式人生 > >獲取手機的唯一標識

獲取手機的唯一標識

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