IMEI/MEID 是什么?
IMEI(nternational Mobile Equipment Identity )是移动设备国际识别码,又称为国际移动设备标识,是手机的唯一识别号码。(针对GSM设备)
MEID (Mobile Equipment Identifier)是移动设备标识码,是每台CDMA设备唯一的识别码。通过这个识别码,可以对该设备进行跟踪和监管。
IMEI/MEID 其实都是相当于设备的身份证号,产生设备这两种“身份证号”的现状,是因为移动无线通信初期标准不统一(主要是欧、美双方)所产生的遗留问题。
GSM/CDMA 是什么?
在移动通信初期,有两种不同的通信技术:GSM与CDMA。CSM卡、CDMA卡指的就是符合这两种通信技术的SIM卡。
GSM(Global System for Mobile Communications) 全球移动通信系统,是由欧洲电信标准组织ETSI( European Telecommunications Standards Institute)制订的一个数字移动通信标准。它采用时分多址技术。
CDMA(Code Division Multiple Access)码分多址是在数字技术的分支扩频通信技术上发展起来的一种无线通信技术。最早起源于二战期间,当时因战争的需要研究开发出来的CDMA技术,其主要目的是为了防止敌方干扰对方的通信,在战争期间CDMA主要应用于军事抗干扰通信,后来被美国高通公司更新成为商用蜂窝电信技术。
在初期移动通信是没有统一标准的,基于这两种技术存在很多通信标准。随着通信技术发展规范,到后面4G/5G(LTE/NR)阶段,才逐渐形成较为统一的规范。基于两种技术,大致有以下通信标准(标参与制定的国家还是挺多的):
GSM类 | CDMA类 |
GPRS EDGE UMTS HSDPA HSUPA HSPA LTE HSPAP GSM TD_SCDMA IWLAN LTE_CA NR | IS95A IS95B 1xRTT EVDO_0 EVDO_A EVDO_B EHRPD |
如何获取?
Android 源码中提供了获取IMEI及MEID的接口。示例代码如下:
private String getInfo() {
TelephonyManager telephonyManager = (TelephonyManager) getSystemService("phone");
StringBuilder sb = new StringBuilder();
int phoneCount = telephonyManager.getPhoneCount();
if (Build.VERSION.SDK_INT > 24) {
for (int i = 0; i < phoneCount; i++) {
String meid = telephonyManager.getMeid(i);
sb.append("MEID:" + meid + "\n");
}
}
for (int i = 0; i < phoneCount; i++) {
String imei = telephonyManager.getImei(i);
sb.append("Imei[" + i + "]:" + imei + "\n");
}
String deviceId = telephonyManager.getDeviceId();
sb.append("deviceId:" + deviceId);
return sb.toString();
}
需要注意的是 getDeviceId 函数,它会根据当前设备网络制式标准返回不同值:如果是GSM类的返回IMEI(此时它内部是调用 getImei 函数),如果是CDMA类返回MEID(此时它内部是调用 getMeid 函数)。