歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 獲取imei(國際移動設備身份碼)號碼詳解及其應用場景

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

日期:2017/3/1 10:12:00   编辑:Linux編程

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