IMEI值和MEID值的获取

作者: 安新小子 | 来源:发表于2017-04-10 13:22 被阅读3005次

    没有了解过这个的可能还不知道 IMEI 和 MEID 是什么东西,下面是百度上的解释:

    IMEI(International Mobile Equipment Identity) 是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的"电子串号",它与每台移动电话机一一对应,而且该码是全世界唯一的。
    MEID 移动设备识别码(Mobile Equipment Identifier)是CDMA手机的身份识别码,也是每台CDMA手机或通讯平板唯一的识别码。

    就是说它们相当于手机的「身份证号」一样,那么两者有什么区别呢?
    也许你已经看出来了,MEID是CDMA手机的识别码,IMEI是GSM、WCDMA手机的识别码,对应到国内的运营商如下

    移动:2G使用 GSM, 3G使用 TD-SCDMA 4G使用TD-LTE
    联通:2G使用 GSM, 3G使用 WCDMA 4G使用TD-LTE、FDD-LTE
    电信:2G使用 CDMA,3G使用 CDMA2000 4G使用TD-LTE、FDD-LTE

    所以,你知道了,IMEI是联通移动手机的标识,MEID是电信手机的标识

    获取标识####

    在Android6.0以前我们都是使用下面方式来获取 IMEI标识,(我没有使用纯电信手机来做测试,不知道下面的方法能不能获取到 MEID 的值)

    TelephonyManager manager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
    
    nameger.getDeviceId();
    

    但是对于现在的手机市场,上面的代码有一个问题,就是现在几乎所有的Android手机都是双卡了,对于双卡手机肯定是不止有一个IMEI值。全网通手机会有两个IMEI和一个MEID,不支持电信的双卡手机有两个IMEI,那又该怎么获取呢?

    通过Google ,在Android6.0的API中找到了这样一个方法getDeviceId(int slotId)
    当看到这个API的时候,你肯定就会想到,参数肯定是让传入手机的制式,而且肯定还是 TelephonyManager的字段,然后我就去找TelephonyManager的字段,找到如下图

    Paste_Image.png

    这是你肯定就会想了,这样可以获取到一个IMEI和一个MEID,怎么获取到两个IMEI呢?别着急,不是还有一个getDeviceId的空参方法呢吗?

    所以这样就可以获取到两个IMEI和MEID了。

    One More Thing####

    作为一个喜欢刨根问底的开发者,当然不会就这么轻易结束,我会想,Android6.0 才出现这个API,而国内的手机在 Android5.0 的时候就已经大面积使用双卡配置了,之前的 Android 版本怎么办呢?然后我就去看了看 Android6.0 之前的源码,原来从 Android5.0 (API21)开始,getDeviceId(int slotId) 这个API就已经存在了,只不过是被 @hide 了,那我们怎么获取呢,当然是反射了

    TelephonyManager manager= (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
    
    Method method = manager.getClass().getMethod("getDeviceId", int.class);
    
    String imei1 = manager.getDeviceId();
    
    String imei2 = (String) method.invoke(manager, 1);
    
    String meid = (String) method.invoke(manager, 2);
    

    至于上面的invoke中传入的 1 和 2,就是 TelephonyManager 中的字段的值。

    欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。

    张鹤的公众号

    相关文章

      网友评论

      • sunsonfly:getDeviceId(int slotId)这个方法的参数slotId,并不是指网络类型,而是卡槽的编号,取值0或者1
        安新小子:我用华为mate8测试的是输入网络类型,能够获取到三个值,你用的什么手机测试的
      • 星_025f:你好!想问下在插入了电信卡,怎么获取IMEI号。这里获取到的是MEID号!
        星_025f:@MTroad 我这边是通过源码中获取,能后传上来的。
        2191eec1eed6:嗨咯,电信卡识别到的信息包括MEID、imei、iccid,用你这个方法获取到的值是meid,有没有什么办法能分别获得到imei号和meid呢:smile:
        安新小子:不好意思,这段时间公司搬家刚看到你的回复,MEID就是电信的标识,IMEI是移动和联通的标识,
      • 平头说人生:按照解释是不是写错了?
        应该是
        MEID是电信的标识
        IMEI 是联通和移动的标识
        安新小子:恩恩,是写错了,谢谢啊,马上修改

      本文标题:IMEI值和MEID值的获取

      本文链接:https://www.haomeiwen.com/subject/yrysattx.html