歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 獲取imei(國際移動設備身份碼)號碼詳解及其應用場景

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.代碼

  1. /**    
  2. *    
  3. * 
  4. *    
  5. */      
  6. package net.sunniwell.app;       
  7. import android.app.Activity;       
  8. import android.os.Bundle;       
  9. import android.telephony.CellLocation;       
  10. import android.telephony.PhoneStateListener;       
  11. import android.telephony.TelephonyManager;       
  12. public class TelManager extends Activity {       
  13.       
  14. @Override      
  15. protected void onCreate(Bundle savedInstanceState) {       
  16.   super.onCreate(savedInstanceState);       
  17.   TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);       
  18.          
  19.   /*    
  20.    * 電話狀態:    
  21.    * 1.tm.CALL_STATE_IDLE=0          無活動    
  22.    * 2.tm.CALL_STATE_RINGING=1  響鈴    
  23.    * 3.tm.CALL_STATE_OFFHOOK=2  摘機    
  24.    */      
  25.   tm.getCallState();//int        
  26.          
  27.   /*    
  28.    * 電話方位:    
  29.    *     
  30.    */      
  31.   tm.getCellLocation();//CellLocation        
  32.          
  33.   /*    
  34.    * 唯一的設備ID:    
  35.    * GSM手機的 IMEI 和 CDMA手機的 MEID.     
  36.    * Return null if device ID is not available.    
  37.    */      
  38.   tm.getDeviceId();//String        
  39.          
  40.   /*    
  41.    * 設備的軟件版本號:    
  42.    * 例如:the IMEI/SV(software version) for GSM phones.    
  43.    * Return null if the software version is not available.     
  44.    */      
  45.   tm.getDeviceSoftwareVersion();//String        
  46.          
  47.   /*    
  48.    * 手機號:    
  49.    * GSM手機的 MSISDN.    
  50.    * Return null if it is unavailable.     
  51.    */      
  52.   tm.getLine1Number();//String        
  53.          
  54.   /*    
  55.    * 附近的電話的信息:    
  56.    * 類型:List<NeighboringCellInfo>     
  57.    * 需要權限:android.Manifest.permission#ACCESS_COARSE_UPDATES    
  58.    */      
  59.   tm.getNeighboringCellInfo();//List<NeighboringCellInfo>        
  60.          
  61.   /*    
  62.    * 獲取ISO標准的國家碼,即國際長途區號。    
  63.    * 注意:僅當用戶已在網絡注冊後有效。    
  64.    *       在CDMA網絡中結果也許不可靠。    
  65.    */      
  66.   tm.getNetworkCountryIso();//String        
  67.          
  68.   /*    
  69.    * MCC+MNC(mobile country code + mobile network code)    
  70.    * 注意:僅當用戶已在網絡注冊時有效。    
  71.    *    在CDMA網絡中結果也許不可靠。    
  72.    */      
  73.   tm.getNetworkOperator();//String        
  74.          
  75.   /*    
  76.    * 按照字母次序的current registered operator(當前已注冊的用戶)的名字    
  77.    * 注意:僅當用戶已在網絡注冊時有效。    
  78.    *    在CDMA網絡中結果也許不可靠。    
  79.    */      
  80.   tm.getNetworkOperatorName();//String        
  81.          
  82.   /*    
  83.    * 當前使用的網絡類型:    
  84.    * 例如: NETWORK_TYPE_UNKNOWN  網絡類型未知  0    
  85.      NETWORK_TYPE_GPRS     GPRS網絡  1    
  86.      NETWORK_TYPE_EDGE     EDGE網絡  2    
  87.      NETWORK_TYPE_UMTS     UMTS網絡  3    
  88.      NETWORK_TYPE_HSDPA    HSDPA網絡  8     
  89.      NETWORK_TYPE_HSUPA    HSUPA網絡  9    
  90.      NETWORK_TYPE_HSPA     HSPA網絡  10    
  91.      NETWORK_TYPE_CDMA     CDMA網絡,IS95A 或 IS95B.  4    
  92.      NETWORK_TYPE_EVDO_0   EVDO網絡, revision 0.  5    
  93.      NETWORK_TYPE_EVDO_A   EVDO網絡, revision A.  6    
  94.      NETWORK_TYPE_1xRTT    1xRTT網絡  7    
  95.    */      
  96.   tm.getNetworkType();//int        
  97.          
  98.   /*    
  99.    * 手機類型:    
  100.    * 例如: PHONE_TYPE_NONE  無信號    
  101.      PHONE_TYPE_GSM   GSM信號    
  102.      PHONE_TYPE_CDMA  CDMA信號    
  103.    */      
  104.   tm.getPhoneType();//int        
  105.          
  106.   /*    
  107.    * Returns the ISO country code equivalent for the SIM provider's country code.    
  108.    * 獲取ISO國家碼,相當於提供SIM卡的國家碼。    
  109.    *     
  110.    */      
  111.   tm.getSimCountryIso();//String        
  112.          
  113.   /*    
  114.    * Returns the MCC+MNC (mobile country code + mobile network code) of the provider of the SIM. 5 or 6 decimal digits.    
  115.    * 獲取SIM卡提供的移動國家碼和移動網絡碼.5或6位的十進制數字.    
  116.    * SIM卡的狀態必須是 SIM_STATE_READY(使用getSimState()判斷).    
  117.    */      
  118.   tm.getSimOperator();//String        
  119.          
  120.   /*    
  121.    * 服務商名稱:    
  122.    * 例如:中國移動、聯通    
  123.    * SIM卡的狀態必須是 SIM_STATE_READY(使用getSimState()判斷).    
  124.    */      
  125.   tm.getSimOperatorName();//String        
  126.          
  127.   /*    
  128.    * SIM卡的序列號:    
  129.    * 需要權限:READ_PHONE_STATE    
  130.    */      
  131.   tm.getSimSerialNumber();//String        
  132.          
  133.   /*    
  134.    * SIM的狀態信息:    
  135.    *  SIM_STATE_UNKNOWN          未知狀態 0    
  136.    SIM_STATE_ABSENT           沒插卡 1    
  137.    SIM_STATE_PIN_REQUIRED     鎖定狀態,需要用戶的PIN碼解鎖 2    
  138.    SIM_STATE_PUK_REQUIRED     鎖定狀態,需要用戶的PUK碼解鎖 3    
  139.    SIM_STATE_NETWORK_LOCKED   鎖定狀態,需要網絡的PIN碼解鎖 4    
  140.    SIM_STATE_READY            就緒狀態 5    
  141.    */      
  142.   tm.getSimState();//int        
  143.          
  144.   /*    
  145.    * 唯一的用戶ID:    
  146.    * 例如:IMSI(國際移動用戶識別碼) for a GSM phone.    
  147.    * 需要權限:READ_PHONE_STATE    
  148.    */      
  149.   tm.getSubscriberId();//String        
  150.          
  151.   /*    
  152.    * 取得和語音郵件相關的標簽,即為識別符    
  153.    * 需要權限:READ_PHONE_STATE    
  154.    */      
  155.   tm.getVoiceMailAlphaTag();//String        
  156.          
  157.   /*    
  158.    * 獲取語音郵件號碼:    
  159.    * 需要權限:READ_PHONE_STATE    
  160.    */      
  161.   tm.getVoiceMailNumber();//String        
  162.          
  163.   /*    
  164.    * ICC卡是否存在    
  165.    */      
  166.   tm.hasIccCard();//boolean        
  167.          
  168.   /*    
  169.    * 是否漫游:    
  170.    * (在GSM用途下)    
  171.    */      
  172.   tm.isNetworkRoaming();//        
  173.          
  174.          
  175.          
  176. }       
  177.       
  178.       
  179. }    
Copyright © Linux教程網 All Rights Reserved