IMEI簡介:
IMEI(International Mobile Equipment Identity)是國際行動裝置身份碼的縮寫,國際移動裝備辨識碼,是由15位元字組成的"電子串號",它與每台手機一一對應,而且該碼是全世界唯一的。每一隻手機在組裝完成後都將被賦予一個全球唯一的一組號碼,這個號碼從生產到交付使用都將被製造生產的廠商所記錄。
IMEI俗稱“串號”,儲存在手機的EEPROM(俗稱“碼片”)裡,熟悉並瞭解這個號碼對我們今後識別手機會起到非常大的作用。首先TAC碼(IMEI的前六位元字)前三位在不同的時期會發生變化,過去的TAC碼前三位在現在的手機上不會出現。過去的一些老型號的手機基本上都是446/448開頭,如moto v328 nokia 7110,而且即使同一部手機在不同的時期也會有不同的TAC碼,如大家最熟悉的8210升級8250。如果前三位是448902就不能升級,因為CPU不同。因此過去所說的只要是同一型號的手機TAC碼一定一樣的說法是不夠準確的,再如愛立信的同一型號手機T39MC在不同地區的地方亦會有不同的號碼:大陸行貨為520406,香港則為520407。我們知道這些區別後就可以通過TAC碼來進行“裝置識別”了,而不必去費心的去牢記IMEI的七、八位元字代表的產地。
IMEI分配:
IMEI碼由GSM(全球移動通訊協會)統一分配,授權BABT(英國通訊認證管理委員會)審受
IMEI的組成:
IMEI由15位元字組成,其組成為: 1、前6位元(TAC,Type Approval Code)是"型號核准號碼",一般代表機型
2、接著的2位元(FAC,Final Assembly Code)是"最後裝配號",一般代表產地
3、之後的6位元(SNR)是"串號",一般代表生產順序號
4、最後1位元(SP)通常是"0",為檢驗碼,目前暫備用。
IMEI碼具有唯一性,貼在手機背面的標誌上,並且讀寫於手機記憶體中。它也是該手機在廠家的"檔案"和"社會安全號碼"。
應用情境:
我們在應用程式需要對使用者提交的資訊加密時,由於手機的IMEI號碼是唯一的(相當於身份證或者指紋的作用),所以我們進行加密的時候可以在需要加密的資訊後加上手機的IMEI號碼,從而加大演算法的複雜度.
android 擷取 imei號碼
核心代碼:
Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
.getDeviceId();
1.加入許可權
在manifest.xml檔案中要添加:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
2.代碼
/** * * * */ package net.sunniwell.app; import android.app.Activity; import android.os.Bundle; import android.telephony.CellLocation; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; public class TelManager extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); /* * 電話狀態: * 1.tm.CALL_STATE_IDLE=0 無活動 * 2.tm.CALL_STATE_RINGING=1 響鈴 * 3.tm.CALL_STATE_OFFHOOK=2 摘機 */ tm.getCallState();//int /* * 電話方位: * */ tm.getCellLocation();//CellLocation /* * 唯一的裝置ID: * GSM手機的 IMEI 和 CDMA手機的 MEID. * Return null if device ID is not available. */ tm.getDeviceId();//String /* * 裝置的軟體版本號碼: * 例如:the IMEI/SV(software version) for GSM phones. * Return null if the software version is not available. */ tm.getDeviceSoftwareVersion();//String /* * 手機號: * GSM手機的 MSISDN. * Return null if it is unavailable. */ tm.getLine1Number();//String /* * 附近的電話的資訊: * 類型:List<NeighboringCellInfo> * 需要許可權:android.Manifest.permission#ACCESS_COARSE_UPDATES */ tm.getNeighboringCellInfo();//List<NeighboringCellInfo> /* * 擷取ISO標準的國家碼,即國際長途區號。 * 注意:僅當使用者已在網路註冊後有效。 * 在CDMA網路中結果也許不可靠。 */ tm.getNetworkCountryIso();//String /* * MCC+MNC(mobile country code + mobile network code) * 注意:僅當使用者已在網路註冊時有效。 * 在CDMA網路中結果也許不可靠。 */ tm.getNetworkOperator();//String /* * 按照字母次序的current registered operator(當前已註冊的使用者)的名字 * 注意:僅當使用者已在網路註冊時有效。 * 在CDMA網路中結果也許不可靠。 */ tm.getNetworkOperatorName();//String /* * 當前使用的網路類型: * 例如: NETWORK_TYPE_UNKNOWN 網路類型未知 0 NETWORK_TYPE_GPRS GPRS網路 1 NETWORK_TYPE_EDGE EDGE網路 2 NETWORK_TYPE_UMTS UMTS網路 3 NETWORK_TYPE_HSDPA HSDPA網路 8 NETWORK_TYPE_HSUPA HSUPA網路 9 NETWORK_TYPE_HSPA HSPA網路 10 NETWORK_TYPE_CDMA CDMA網路,IS95A 或 IS95B. 4 NETWORK_TYPE_EVDO_0 EVDO網路, revision 0. 5 NETWORK_TYPE_EVDO_A EVDO網路, revision A. 6 NETWORK_TYPE_1xRTT 1xRTT網路 7 */ tm.getNetworkType();//int /* * 手機類型: * 例如: PHONE_TYPE_NONE 無訊號 PHONE_TYPE_GSM GSM訊號 PHONE_TYPE_CDMA CDMA訊號 */ tm.getPhoneType();//int /* * Returns the ISO country code equivalent for the SIM provider's country code. * 擷取ISO國家碼,相當於提供SIM卡的國家碼。 * */ tm.getSimCountryIso();//String /* * Returns the MCC+MNC (mobile country code + mobile network code) of the provider of the SIM. 5 or 6 decimal digits. * 擷取SIM卡提供的移動國家碼和移動網路碼.5或6位的十進位數字. * SIM卡的狀態必須是 SIM_STATE_READY(使用getSimState()判斷). */ tm.getSimOperator();//String /* * 服務商名稱: * 例如:中國移動、聯通 * SIM卡的狀態必須是 SIM_STATE_READY(使用getSimState()判斷). */ tm.getSimOperatorName();//String /* * SIM卡的序號: * 需要許可權:READ_PHONE_STATE */ tm.getSimSerialNumber();//String /* * SIM的狀態資訊: * SIM_STATE_UNKNOWN 未知狀態 0 SIM_STATE_ABSENT 沒插卡 1 SIM_STATE_PIN_REQUIRED 鎖定狀態,需要使用者的數字 PIN 碼解鎖 2 SIM_STATE_PUK_REQUIRED 鎖定狀態,需要使用者的PUK碼解鎖 3 SIM_STATE_NETWORK_LOCKED 鎖定狀態,需要網路的數字 PIN 碼解鎖 4 SIM_STATE_READY 就緒狀態 5 */ tm.getSimState();//int /* * 唯一的使用者ID: * 例如:IMSI(國際移動使用者識別碼) for a GSM phone. * 需要許可權:READ_PHONE_STATE */ tm.getSubscriberId();//String /* * 取得和語音信箱相關的標籤,即為識別符 * 需要許可權:READ_PHONE_STATE */ tm.getVoiceMailAlphaTag();//String /* * 擷取語音信箱號碼: * 需要許可權:READ_PHONE_STATE */ tm.getVoiceMailNumber();//String /* * ICC卡是否存在 */ tm.hasIccCard();//boolean /* * 是否漫遊: * (在GSM用途下) */ tm.isNetworkRoaming();// } }