Android UIAndroid开发Android技术知识

IMEI值和MEID值的获取

2017-04-10  本文已影响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 中的字段的值。

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

张鹤的公众号
上一篇下一篇

猜你喜欢

热点阅读