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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值