如何解决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也基本上是因为它可以作为唯一标识,所以大多数情况下我们并不需要去关注最后一位的数值。