1. 程式人生 > >Android獲取手機IMEI,IMSI, MAC標識和唯一標識的生成

Android獲取手機IMEI,IMSI, MAC標識和唯一標識的生成

急的直接看這個:

android 獲取裝置IMEI與序列號:

​
//IMEI(imei)
TelephonyManager tm = (TelephonyManager) ChinaApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
if(!TextUtils.isEmpty(imei)){
    deviceId.append("imei");
    deviceId.append(imei);
    return deviceId.toString();
}

//序列號(sn)
String sn = tm.getSimSerialNumber();
if(!TextUtils.isEmpty(sn)){
    deviceId.append("sn");
    deviceId.append(sn);
    return deviceId.toString();
}

​

Android的幾種標識

1. IMEI

IMEI(International Mobile Equipment Identity)是國際移動裝置身份碼的縮寫,國際移動裝備辨識碼,是由15位數字組成的"電子串號",它與每臺行動電話機一一對應,而且該碼是全世界唯一的。每一隻行動電話機在組裝完成後都將被賦予一個全球唯一的一組號碼,這個號碼從生產到交付使用都將被製造生產的廠商所記錄。

PS:通俗來講就是標識你當前裝置(手機)全世界唯一,類似於個人身份證

許可權要求:android.permission.READ_PHONE_STATE

​
public synchronized static String getid(Context context) { 
    TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);  
    String ID= TelephonyMgr.getDeviceId(); 
    return ID;
}

​

2. IMSI

國際移動使用者識別碼(IMSI:International Mobile Subscriber Identification

Number)是區別移動使用者的標誌,儲存在SIM卡中,可用於區別移動使用者的有效資訊。其總長度不超過15位,同樣使用0~9的數字。其中MCC是移動使用者所屬國家代號,佔3位數字,中國的MCC規定為460;MNC是移動網號碼,由兩位或者三位數字組成,中國移動的行動網路編碼(MNC)為00;用於識別移動使用者所歸屬的行動通訊網;MSIN是移動使用者識別碼,用以識別某一行動通訊網中的移動使用者

PS:通俗來講就是標識你當前SIM卡(手機卡)唯一,同樣類似於個人身份證

3. MAC

MAC(Media Access Control或者Medium Access Control)地址,意譯為媒體訪問控制,或稱為實體地址、硬體地址,用來定義網路裝置的位置。在OSI模型中,第三層網路層負責 IP地址,第二層資料鏈路層則負責 MAC地址。因此一個主機會有一個MAC地址,而每個網路位置會有一個專屬於它的IP地址

PS:通俗來講就是標識你當前使用我這個軟體(功能)時的地址

最主要的是:在平板裝置上,無法通過imei標示裝置,我們會將mac地址作為使用者的唯一標識

許可權要求:android.permission.ACCESS_WIFI_STATE 

​
public synchronized static String getMacid(Context context) { 
      WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
       String WLANMAC = wm.getConnectionInfo().getMacAddress();
       return WLANMAC ;
 }

​

4. 藍芽

許可權要求:android.permission.BLUETOOTH

​
public synchronized static String getMacid(Context context) { 
    BluetoothAdapter mBlueth= BluetoothAdapter.getDefaultAdapter();  
    String mBluethId= mBlueth.getAddress();
     return mBluethId; 
}

​

5. Installtion ID

     考慮到Android裝置的多樣性,比如一些平板沒有通話功能,或者部分低價裝置沒有WLAN或者藍芽,甚至使用者不願意賦予APP這些需要的許可權,我們就使用無需許可權的方法;這種方式的原理是在程式安裝後第一次執行時生成一個ID,該方式和裝置唯一標識不一樣,不同的應用程式會產生不同的ID,同一個程式重新安裝也會不同。所以這不是裝置的唯一ID,但是可以保證每個使用者的ID是不同的。可以說是用來標識每一份應用程式的唯一ID(即Installtion ID),可以用來跟蹤應用的安裝數量等。 

​
public class GetDeviceid { 
private static String sID = null; 
private static final String INSTALLATION = "INSTALLATION"; 
public synchronized static String id(Context context) { 
      if (sID == null) {
         File installation = new File(context.getFilesDir(), INSTALLATION); 
      try {
     if (!installation.exists()) 
        writeInstallationFile(installation);
         sID = readInstallationFile(installation); 
    } catch (Exception e) {
     throw new RuntimeException(e); 
    } 
  } 
      return sID;
 }

 private static String readInstallationFile(File installation) throws IOException { 
      RandomAccessFile f = new RandomAccessFile(installation, "r"); 
      byte[] bytes = new byte[(int) f.length()];
      f.readFully(bytes); 
      f.close(); 
      return new String(bytes);
 } 

private static void writeInstallationFile(File installation) throws IOException { 
      FileOutputStream out = new FileOutputStream(installation); 
      String id = UUID.randomUUID().toString(); 
      out.write(id.getBytes());
       out.close(); 
    }
}

​

5. Combined Device ID

      綜上所述,我們有多種方式取得裝置的唯一標識。它們中的一些可能會返回null,或者由於硬體缺失、許可權問題等獲取失敗。但你總能獲得至少一個能用。所以,最好的方法就是通過拼接,或者拼接後的計算出的MD5值來產生一個結果。

String m_szLongID = m_szImei + m_szDevIDShort + m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
     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 (b <= 0xF) {
                  m_szUniqueID+="0"; 
              }
              
          // add number to string  
          m_szUniqueID+=Integer.toHexString(b);
         }

 // hex string to uppercase 
 m_szUniqueID = m_szUniqueID.toUpperCase();