天天看點

如何解決IMEI缺少最後一位的問題如何解決IMEI缺少最後一位的問題

如何解決IMEI缺少最後一位的問題

IMEI介紹

IMEI(International Mobile Equipment Identity,移動裝置國際識别碼,又稱為國際移動裝置辨別)是手機的唯一識别号碼。我們從這個縮寫的全稱中來分析它的含義:

  1. “移動裝置”就是手機,不包括便攜式電腦。
  2. “國際”這個字眼也表明了它可辨識的範圍是全球,即全球範圍内IMEI不會重複。
  3. “身份”表明了它的作用,是辨識不同的手機;一機一号,類似于人的身份證号。
  4. “碼”字又說明它是一串編号,常稱為手機的“串号”、“電子串号”。

IMEI由15位數字組成,每位數字僅使用0~9的數字,其組成為:

  1. 前6位數(TAC,Type Approval Code)是“型号核準号碼”,一般代表機型。
  2. 接着的2位數(FAC,Final Assembly Code)是“最後裝配号”,一般代表産地。
  3. 之後的6位數(SNR,Serial Number,出廠序号)是“串号”,一般代表生産順序号。
  4. 最後1位數(SP)通常是“0”,為檢驗碼,備用。

摘抄自百度。

IMEI讀取

網絡上關于IMEI的讀取方式幾乎都一樣,代碼如下

TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = telephonyManager.getDeviceId();
           

當然我也是這麼幹的,直到我發現有一部手機在系統設定裡檢視到的 IMEI和我通過這段代碼讀取的IMEI不一緻。

  1. 系統設定:353852062689226
  2. 代碼讀取:35385206268922

窩草ヾ(。`Д´。),怎麼少了最後一位!在仔細看看發現少的那一位就是最後一位校驗位。經過一番了解,發現市面上大概有10%的手機通過代碼讀取的IMEI會缺少最後一位,這問題不解決不行啊。

我們知道缺少的是最後一位資料校驗位,那麼解決方式就是我們需要根據前面14位計算出校驗位,具體計算公式如下:

  1. 将每一個偶數位的數字乘2,然後計算出乘積的十位數和個數之和。
  2. 将奇數位的數字相加,然後加上第一步得到的和。
  3. 如果結果的個位是0,則校驗位為0,否則為10減去個位數。

這裡我們以【35385206268922】為例:

  1. 每兩位數分為一組

    35 - 38 - 52 - 06 - 26 - 89 - 22

  2. 計算奇數位和偶數位乘積的個位數和十位數之和

    sum = (3 + 1 + 0) + (3 + 1 + 6) + (5 + 0 + 4) + (0 + 1 + 2) + (2 + 1 + 2) + (8 + 1 + 8) + (2 + 0 + 4) = 54

  3. 結果為54,我們的校驗位要用10減去個位數4

    sp = 10 - 4 = 6

最後我們計算出了校驗位位6,然後我們比較一下對不對:

  1. 系統設定:353852062689226
  2. 代碼讀取:35385206268922【6】

至于如何通過代碼實作這個算法,我這裡就不多說了,因為真的不難╮(╯▽╰)╭。

結束語

14位的IMEI實際上也是能夠保障它的唯一性的,而我們需要用到IMEI也基本上是因為它可以作為唯一辨別,是以大多數情況下我們并不需要去關注最後一位的數值。