如何解決IMEI缺少最後一位的問題
IMEI介紹
IMEI(International Mobile Equipment Identity,移動裝置國際識别碼,又稱為國際移動裝置辨別)是手機的唯一識别号碼。我們從這個縮寫的全稱中來分析它的含義:
- “移動裝置”就是手機,不包括便攜式電腦。
- “國際”這個字眼也表明了它可辨識的範圍是全球,即全球範圍内IMEI不會重複。
- “身份”表明了它的作用,是辨識不同的手機;一機一号,類似于人的身份證号。
- “碼”字又說明它是一串編号,常稱為手機的“串号”、“電子串号”。
IMEI由15位數字組成,每位數字僅使用0~9的數字,其組成為:
- 前6位數(TAC,Type Approval Code)是“型号核準号碼”,一般代表機型。
- 接着的2位數(FAC,Final Assembly Code)是“最後裝配号”,一般代表産地。
- 之後的6位數(SNR,Serial Number,出廠序号)是“串号”,一般代表生産順序号。
- 最後1位數(SP)通常是“0”,為檢驗碼,備用。
摘抄自百度。
IMEI讀取
網絡上關于IMEI的讀取方式幾乎都一樣,代碼如下
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = telephonyManager.getDeviceId();
當然我也是這麼幹的,直到我發現有一部手機在系統設定裡檢視到的 IMEI和我通過這段代碼讀取的IMEI不一緻。
- 系統設定:353852062689226
- 代碼讀取:35385206268922
窩草ヾ(。`Д´。),怎麼少了最後一位!在仔細看看發現少的那一位就是最後一位校驗位。經過一番了解,發現市面上大概有10%的手機通過代碼讀取的IMEI會缺少最後一位,這問題不解決不行啊。
我們知道缺少的是最後一位資料校驗位,那麼解決方式就是我們需要根據前面14位計算出校驗位,具體計算公式如下:
- 将每一個偶數位的數字乘2,然後計算出乘積的十位數和個數之和。
- 将奇數位的數字相加,然後加上第一步得到的和。
- 如果結果的個位是0,則校驗位為0,否則為10減去個位數。
這裡我們以【35385206268922】為例:
-
每兩位數分為一組
35 - 38 - 52 - 06 - 26 - 89 - 22
-
計算奇數位和偶數位乘積的個位數和十位數之和
sum = (3 + 1 + 0) + (3 + 1 + 6) + (5 + 0 + 4) + (0 + 1 + 2) + (2 + 1 + 2) + (8 + 1 + 8) + (2 + 0 + 4) = 54
-
結果為54,我們的校驗位要用10減去個位數4
sp = 10 - 4 = 6
最後我們計算出了校驗位位6,然後我們比較一下對不對:
- 系統設定:353852062689226
- 代碼讀取:35385206268922【6】
至于如何通過代碼實作這個算法,我這裡就不多說了,因為真的不難╮(╯▽╰)╭。
結束語
14位的IMEI實際上也是能夠保障它的唯一性的,而我們需要用到IMEI也基本上是因為它可以作為唯一辨別,是以大多數情況下我們并不需要去關注最後一位的數值。