获取手机唯一识别码IMEI

news/2024/12/5 12:43:28/
  1. 前言

获取IMEI相信大家非常熟悉,但是项目中使用时,发现当手机卡为电信的时候,获取的并不是IMEI,而是MEID,什么是MEID,为什么会出现这种情况呢?
IMEI国际移动设备识别码(IMEI:International Mobile Equipment Identification Number)是区别移动设备的标志,储存在移动设备中,可用于监控被窃或无效的移动设备。目前GSM和WCDMA手机终端需要使用IMEI号码
MEID移动设备识别码(Mobile Equipment Identifier)是CDMA手机的身份识别码,也是每台手机有唯一的识别码。通过这个识别码,网络端可以对该手机进行跟踪和监管。用于CDMA制式的手机。MEID的数字范围是十六进制的,和IMEI的格式类似。

2.使用方法

为什么会出现获取的不是IMEI,而是MEID呢,继续往下看。
一般情况下,大家获取imei号,通过以下两个步骤实现。
1)添加读取权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

2)获取设备imei号

public static String getImei(Context context) {TelephonyManager telephonyMgr = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);String imei = telephonyMgr.getDeviceId();return imei ;
}

很明显,通过调用getDeviceId()希望获取IMEI,但是得到的却是MEID,定位到getDeviceId()的源码,如下:

/*** Returns the unique device ID, for example, the IMEI for GSM and the MEID* or ESN for CDMA phones. Return null if device ID is not available.** <p>Requires Permission:*   {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}*/public String getDeviceId() {try {ITelephony telephony = getITelephony();if (telephony == null)return null;return telephony.getDeviceId(mContext.getOpPackageName());} catch (RemoteException ex) {return null;} catch (NullPointerException ex) {return null;}}

注释很明显了,CDMA手机返回的是MEID或者ESN,也就是电信卡返回的是MEID,到这里我们发现了问题所在,那么如何解决呢,浏览源码,我们发现,有个隐藏的(hide)方法,如下:

 /*** Returns the IMEI. Return null if IMEI is not available.** <p>Requires Permission:*   {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}*//** {@hide} */public String getImei() {return getImei(getDefaultSim());}

这个方法可以获取IMEI,但是由于是hide方法,不能直接调用,所以我们只能通过反射调用该方法。

3.通过反射获取IMEI

代码很简单,如下所示:

public static String getMachineImei(Context context) {TelephonyManager manager = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);Class clazz = manager.getClass();String imei = "";try {Method getImei=clazz.getDeclaredMethod("getImei",int.class);//(int slotId)getImei.setAccessible(true);imei = (String) getImei.invoke(manager);} catch (Exception e) {}return imei;}

通过上述反射调用getImei(),则可以在电信卡手机成功获取IMEI号,当前前提是存在IMEI号。


如有错误欢迎指出来,一起学习。
在这里插入图片描述


http://www.ppmy.cn/news/699092.html

相关文章

手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)

文章目录 Android篇1 IMEI和MEID2 DeviceId3 mac地址4 ANDROID_ID5 UUID6 OpenUDID7 Serial Number8 IDFA9 GAID iOS篇1 IMEI2 IDFA3 mac地址4 UDID5 UUID6 如何正确的获取设备的唯一标识7 什么是钥匙串 Android篇 1 IMEI和MEID (1) IMEI (International Mobile Equipment Id…

HDLbits--Exams/review2015 fsm

示例&#xff1a; 题目的主要意思是&#xff1a;复位之后寻找1101序列&#xff0c;找到之后shift ena在四个周期内为1&#xff0c;此后输出counting&#xff0c;如果done-counting0&#xff0c;则counting一直为1&#xff0c;直到done-counting1&#xff0c;counting才为0&…

Java并发应用编程之任务执行分析

目录 概述1.任务执行边界划分2.服务器应用程序的想法和实现2.1 串行执行任务2.2 为每个请求创建线程来执行任务 概述 DougLea等人写的《Java并发编程实战》中是这样描述任务的&#xff1a;“在多数的并发应用程序中&#xff0c;都是围绕着“任务执行”来构造的&#xff0c;而任…

OPPO尝鲜android版本更新,安卓11迎来四大贴心升级,OPPO小米率先尝鲜

9月9日&#xff0c;谷歌正式发布了Android 11系统&#xff0c;国产手机厂商迅速做出反应&#xff0c;其中&#xff0c;小米和OPPO立即开启了升级推送通知&#xff0c;用户收到后就可以直接下载安装使用&#xff0c;这样的速度可以说是秒推送了。虽然Android 11系统此次升级并没…

OPPOa11android登录网络,OPPO新机入网运行Android 11系统

文章来源&#xff1a;科技讯 本月初OPPO两款机型通过了工信部入网审核包括SparrowNews和GSMArena在内的多家外媒和国内媒体将其称为OPPO Reno5系列 OPPO 新机正面采用了一块 6.43 英寸的 FHD 分辨率的 AMOLED 屏幕搭载了一颗主频为 2.4GHz 的 8 核处理器网友猜测可能是天玑 80…

el-select修改样式

目录 准备 修改placeholder颜色 修改右侧箭头 修改圆角边框 准备 <el-select v-model"goodsId" clearable placeholder"请选择" :popper-append-to-body"false"><el-option v-for"item in kindList" :key"item.value…

G1吊舱全面升级,新增软件驱动库,支持多平台使用

G1吊舱&#xff0c;是我们去年推出的一款自研的云台产品&#xff0c;体积小巧&#xff0c;功能强大&#xff0c;上市后得到了很多朋友的支持。在上市后的一年期间&#xff0c;我们多方收集用户反馈&#xff0c;并基于用户的宝贵建议对G1吊舱进行了软硬件上的升级。 ​ 一、软件…

苹果手机app应用显示未受信任打不开怎么办

用HBuilder开发的ios手机版移动应用&#xff0c;安装在手机上&#xff0c;打开时会显示“未受信任的企业级开发者”&#xff0c;只有一个【取消】按钮。我们经常在开发时&#xff0c;会遇到这种问题&#xff0c;那么下面就是我总结出来的解决方法 方法/步骤 我们在使用苹果IOS…