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;iint 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