1. 程式人生 > >android獲取裝置唯一識別符號

android獲取裝置唯一識別符號


1、獲取IMEI:

adb命令:adb shell dumpsys iphonesubinfo


手機裝置檢視:<1>*#06#(通話快捷查詢)<2>設定--->關於手機--->狀態訊息--->IMEI <3>直接開啟手機後蓋,拆下電池,就可以在內部標籤上找到IMEI串號

<uses-permission android:name="android.permission.READ_PHONE_STATE" />(新增許可權)

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

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進位制資料)