android獲取裝置唯一識別符號
1、獲取IMEI:
adb命令:adb shell dumpsys iphonesubinfo
手機裝置檢視:<1>*#06#(通話快捷查詢)<2>設定--->關於手機--->狀態訊息--->IMEI <3>直接開啟手機後蓋,拆下電池,就可以在內部標籤上找到IMEI串號
<uses-permission android:name="android.permission.READ_PHONE_STATE" />(新增許可權)
String IMEIstr = telephonyManager.getDeviceId();
問題:
<1>非手機裝置:比如平板電腦,不具有通話功能,無法獲取TELEPHONY_SERVICE。
<2>廠商定製系統中的Bug:少數手機裝置上會返回垃圾,如:zeros或者asterisks。
<3>假設是一個沒有量產(上市:新開發的產品都要經過硬體及軟體方面的測試,當這些測試都通過時,才能上市)的水貨手機,獲取可能為:0000000000000。
2、取ROM版本、製造商、CPU型號、以及其他硬體資訊來實現:(遇到非手機裝置或不願意加入READ_PHONE_STATE)
String myPseudoIMEIStr = "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.MANUFACTURER.length()%10 +
Build.MODEL.length()%10 +
Build.PRODUCT.length()%10 +
Build.TAGS.length()%10 +
Build.TYPE.length()%10 +
Build.USER.length()%10 ;
System.out.println(myPseudoIMEIStr);
附:(adb檢視手機裝置資訊)
- android prop檔案中儲存硬體裝置的重要資訊:
- getprop 檢視機器的全部資訊引數
getprop ro.serialno 檢視機器的序列號
getprop ro.carrier 檢視機器的CID號
getprop ro.hardware 檢視機器板子代號
getprop ro.bootloader 檢視SPL(Hboot)版本號
問題:如果兩個手機應用了同樣的硬體以及Rom 映象,ID也不唯一
3、secure.ANDROID_ID:(無需任何許可權許可)
String mySecureAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
System.out.println(mySecureAndroidID);
或:
String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);
System.out.println(ANDROID_ID);
問題:ID會改變,如果進行了出廠設定。並且,如果某個Andorid手機被Root(wipe後該值會被重置)過的話,這個ID也可以被任意改變。或是廠商定製系統的bug,會出現相同的ID或返回null,
對於CDMA裝置,ANDROID_ID和TelephonyManager.getDeviceId() 返回相同的值。
4、獲取WlanMac:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />(新增許可權)
WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String myWlanMacStr = wifiManager.getConnectionInfo().getMacAddress();
System.out.println(myWlanMacStr);
問題:在WLAN不必開啟就可以讀取值,不是一個真實地址,並且地址可以偽造。(不可靠)
5、獲取BluetoothMac:
<uses-permission android:name="android.permission.BLUETOOTH"/>(新增許可權)
String myBoletoothStr = BluetoothAdapter.getDefaultAdapter().getAddress();
System.out.println(myBoletoothStr);
問題:只在有藍芽的裝置上執行,藍芽需要開啟,否則無法獲取到Mac資訊。
6、自定義組合方式:(將以上5種方式通過拼接方式生成MD5)
String myCombinedDeviceID = myIMEIStr + myPseudoIMEIStr
+ mySecureAndroidID+ myWlanMacStr + myBoletoothStr;
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
messageDigest.update(myCombinedDeviceID.getBytes(),0,myCombinedDeviceID.length());
byte md5Data[] = messageDigest.digest();
String myUniqueDeviceID = new String();
for (int i=0;i<md5Data.length;i++) {
int b = (0xFF & md5Data[i]);
if (b <= 0xF)
myUniqueDeviceID+="0";
myUniqueDeviceID+=Integer.toHexString(b);
myUniqueDeviceID = myUniqueDeviceID.toUpperCase();
}
System.out.println(myUniqueDeviceID);
結果:(第一個為本機真實IMEI,第二個為偽造的IMEI,之後為3、4、5的ID,最後一個產生32位的16進位制資料)