获取手机的唯一标识

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

你可能感兴趣的:(app开发)