关于安卓系统4.0/5.0/6.0获取单卡手机,双卡手机的imei1,imei2,meid(用反射来实现,史上最详细,最全面获取)--binbinyang

article/2025/9/20 15:28:27

有的人问我要代码跟例子,上次在GITHUB上弄了一个,提供地址 给大家

 https://github.com/binbinyYang/GetPhoneInfo


https://github.com/binbinyYang/GetPhoneInfo


--------------------------------------------------------


最近这3天,一直在做获取手机的,imei1,imei2,meid,sn等手机系统信息的小app,在做的过程中,遇到了很多问题,发现网络上对这块的技术帖子,并不多,关键是还不详细,有的帖子三言两语,几句话,其实说的还是4.0版本的获取,获取了imei 获取不到meid,有的帖子贴了一堆代码,其实也并没有什么卵用,有的帖子一长串反射代码,也是无关痛痒,  所以今天我想把我这3天的心得,分享出来,也想让广大开发者,提供点个人的帮助!


开始之前,这是方法getDeviceId()的源码,这串英文 我就不翻译了,自己看,网上大部分帖子都是说用这个,其实这个只是4.0的时候拿的。但是4.0的手机也有双卡手机,所以这就有坑了


市面上的安卓手机,有很多种,系统也有各种各样,有的4.0左右系统,有的5.0左右系统,有的6.0左右系统,有单卡槽的,有双卡槽的,有全网通的,有卡槽一个是uim一个是 Sim的,有双SIM的

现在我讲图文并茂展示下,我手上测试机,测试后的情况

1.魅族PRO 6手机 双卡双待 ,卡1卡2均为SIM卡,系统是基于安卓5.0的 有自己的SIM

下面的图,是我自己写的安卓代码得到的



下面图。是关于设置里面查找的



这是运行的GIF动态图




2.手机是魅族 pro6 plus双卡手机,它是没有MEID 的,手机系统是5.0+

 


3.手机是最老的 魅族not 系统是4.0+,双卡手机 卡1是UIM 卡2是SIM



总结以上:基于安卓系统。4.0  5.0  6.0的系统

  1. 4.0的系统如果想获取MEID/IMEI1/IMEI2  ----其实是很难做到的。 因为你只能只用getDeviceId()  这个方法
  2. 5.0的系统如果想获取MEID/IMEI1/IMEI2  ----framework层提供了两个属性值“ril.cdma.meid"和“ril.gsm.imei"获取meid、imei1、imei2(5.0的时候如果想要获取,必须使用反射方法,去拿,下面慢慢看。我会把代码贴出来)
  3. 6.0的系统如果想获取MEID/IMEI1/IMEI2  ---- 直接获取系统api  


          getDeviceId(int slotId)  //指定slotId的deviceId


      getDeviceId(0)  getDeviceId(1)

 但是全网通手机Phone在初始化时只创建了GSMPhone,并没有创建CDMAPhone,此时是无法获取到meid。只有插入CDMA卡才会通过PhoneProxy的deleteAndCreatePhone方法,将其中一个phone删除,重新创建CDMALTEPhone。但是,由于支持盲插功能,我们并不知道用户会将cdma卡插入哪个卡槽,CDMALTEPhone有可能是卡1,也有可能是卡2。因此使用google原生接口获取deviceId会出现如下三种情况:

      1、不插卡(或两张卡都是GSM卡)

      getDeviceId()  返回 imei1

      getDeviceId(0) 返回 imei1

      getDeviceId(1) 返回 imei2

      2、卡1插CDMA卡,卡2不插卡(或卡2插GSM卡)

      getDeviceId()   返回 meid

      getDeviceId(0) 返回 meid

      getDeviceId(1) 返回 imei2

      3、卡2插CDMA卡,卡1不插卡(或卡1插GSM卡)

      getDeviceId()   返回 imei1

      getDeviceId(0) 返回 imei1

      getDeviceId(1) 返回 meid



好吧,上面罗里吧嗦的说了一堆, 我就直接上代码了

 if (Build.VERSION.SDK_INT < 21) {//如果获取系统的IMEI/MEID,14位代表meid 15位是imeiif (GetSystemInfoUtil.getNumber(getActivity()) == 14) {mTvPhoneMeid.setText(GetSystemInfoUtil.getImeiOrMeid(getActivity()));//meid} else if (GetSystemInfoUtil.getNumber(getActivity()) == 15) {mTvPhoneImei.setText(GetSystemInfoUtil.getImeiOrMeid(getActivity()));//imei1}// 21版本是5.0,判断是否是5.0以上的系统  5.0系统直接获取IMEI1,IMEI2,MEID} else if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT<23) {mTvPhoneImei.setText(GetSystemInfoUtil.getImei1());//imei1mTvPhoneOtherImei.setText(GetSystemInfoUtil.getImei2());//imei2mTvPhoneMeid.setText(GetSystemInfoUtil.getMeid());//meid}else  if(Build.VERSION.SDK_INT>=23){final TelephonyManager tm = (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);String imei1 = tm.getDeviceId(0);String imei2 = tm.getDeviceId(1);mTvPhoneImei.setText(imei1);//imei1mTvPhoneOtherImei.setText(imei2);//imei2mTvPhoneMeid.setText(GetSystemInfoUtil.getMeid());//meid}

/*** 获取SN** @return*/public static String getSn(Context ctx) {
//         if (android.os.Build.SERIAL.equals("unknown")) {//MX3手机会出现这个String serial = null;try {Class<?> c = Class.forName("android.os.SystemProperties");Method get = c.getMethod("get", String.class);serial = (String) get.invoke(c, "ro.serialno");} catch (Exception ignored) {}return serial;
//        } else {
//            return android.os.Build.SERIAL;
//        }}/*** 系统4.0的时候* 获取手机IMEI 或者Meid** @return 手机IMEI*/public static String getImeiOrMeid(Context ctx) {TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Activity.TELEPHONY_SERVICE);if (tm != null) {return tm.getDeviceId();}return null;}
/*** 获取IMEI IMEI2 MEID* @param ctx* @return*/@RequiresApi(api = Build.VERSION_CODES.M)public static Map getImeiAndMeid(Context ctx) {Map<String, String> map = new HashMap<String, String>();TelephonyManager mTelephonyManager = (TelephonyManager) ctx.getSystemService(Activity.TELEPHONY_SERVICE);Class<?> clazz = null;Method method = null;//(int slotId)try {clazz = Class.forName("android.os.SystemProperties");method = clazz.getMethod("get", String.class, String.class);String gsm = (String) method.invoke(null, "ril.gsm.imei", "");String meid = (String) method.invoke(null, "ril.cdma.meid", "");map.put("meid", meid);if (!TextUtils.isEmpty(gsm)) {//the value of gsm like:xxxxxx,xxxxxxString imeiArray[] = gsm.split(",");if (imeiArray != null && imeiArray.length > 0) {map.put("imei1", imeiArray[0]);if (imeiArray.length > 1) {map.put("imei2", imeiArray[1]);} else {map.put("imei2", mTelephonyManager.getDeviceId(1));}} else {map.put("imei1", mTelephonyManager.getDeviceId(0));map.put("imei2", mTelephonyManager.getDeviceId(1));}} else {map.put("imei1", mTelephonyManager.getDeviceId(0));map.put("imei2", mTelephonyManager.getDeviceId(1));}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return map;}

/*** 获取手机系统内部信息工具类* Created by yangbin on 3/2/2017.*/public class GetSystemInfoUtil {/*** 获取当前手机系统版本号** @return 系统版本号*/public static String getSystemVersion() {return Build.DISPLAY;//return android.os.Build.VERSION.RELEASE;}/*** 获取手机型号** @return 手机型号*/public static String getSystemModel() {return Build.MODEL;}/*** 获取手机厂商** @return 手机厂商*/public static String getDeviceBrand() {return Build.BRAND;}/*** 获取SN** @return*/public static String getSn(Context ctx) {String serial = null;try {Class<?> c = Class.forName("android.os.SystemProperties");Method get = c.getMethod("get", String.class);serial = (String) get.invoke(c, "ro.serialno");} catch (Exception ignored) {}return serial;}/*** 系统4.0的时候* 获取手机IMEI 或者Meid** @return 手机IMEI*/public static String getImeiOrMeid(Context ctx) {TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Activity.TELEPHONY_SERVICE);if (tm != null) {return tm.getDeviceId();}return null;}/*** 拿到imei或者meid后判断是有多少位数** @param ctx* @return*/public static int getNumber(Context ctx) {int count = 0;long number = Long.parseLong(getImeiOrMeid(ctx).trim());while (number > 0) {number = number / 10;count++;}return count;}/*** Flyme 说 5.0 6.0统一使用这个获取IMEI IMEI2 MEID* @param ctx* @return*/@RequiresApi(api = Build.VERSION_CODES.M)public static Map getImeiAndMeid(Context ctx) {Map<String, String> map = new HashMap<String, String>();TelephonyManager mTelephonyManager = (TelephonyManager) ctx.getSystemService(Activity.TELEPHONY_SERVICE);Class<?> clazz = null;Method method = null;//(int slotId)try {clazz = Class.forName("android.os.SystemProperties");method = clazz.getMethod("get", String.class, String.class);String gsm = (String) method.invoke(null, "ril.gsm.imei", "");String meid = (String) method.invoke(null, "ril.cdma.meid", "");map.put("meid", meid);if (!TextUtils.isEmpty(gsm)) {//the value of gsm like:xxxxxx,xxxxxxString imeiArray[] = gsm.split(",");if (imeiArray != null && imeiArray.length > 0) {map.put("imei1", imeiArray[0]);if (imeiArray.length > 1) {map.put("imei2", imeiArray[1]);} else {map.put("imei2", mTelephonyManager.getDeviceId(1));}} else {map.put("imei1", mTelephonyManager.getDeviceId(0));map.put("imei2", mTelephonyManager.getDeviceId(1));}} else {map.put("imei1", mTelephonyManager.getDeviceId(0));map.put("imei2", mTelephonyManager.getDeviceId(1));}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return map;}
}




下面贴出我的整个工具类

/*** 获取手机系统内部信息工具类* Created by yangbin on 3/2/2017.*/public class GetSystemInfoUtil {/*** 获取当前手机系统版本号** @return 系统版本号*/public static String getSystemVersion() {return Build.DISPLAY;//return android.os.Build.VERSION.RELEASE;}/*** 获取手机型号** @return 手机型号*/public static String getSystemModel() {return Build.MODEL;}/*** 获取手机厂商** @return 手机厂商*/public static String getDeviceBrand() {return Build.BRAND;}/*** 获取SN** @return*/public static String getSn(Context ctx) {String serial = null;try {Class<?> c = Class.forName("android.os.SystemProperties");Method get = c.getMethod("get", String.class);serial = (String) get.invoke(c, "ro.serialno");} catch (Exception ignored) {}return serial;}/*** 系统4.0的时候* 获取手机IMEI 或者Meid** @return 手机IMEI*/public static String getImeiOrMeid(Context ctx) {TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Activity.TELEPHONY_SERVICE);if (tm != null) {return tm.getDeviceId();}return null;}/*** 拿到imei或者meid后判断是有多少位数** @param ctx* @return*/public static int getNumber(Context ctx) {int count = 0;long number = Long.parseLong(getImeiOrMeid(ctx).trim());while (number > 0) {number = number / 10;count++;}return count;}/*** Flyme 说 5.0 6.0统一使用这个获取IMEI IMEI2 MEID* @param ctx* @return*/@RequiresApi(api = Build.VERSION_CODES.M)public static Map getImeiAndMeid(Context ctx) {Map<String, String> map = new HashMap<String, String>();TelephonyManager mTelephonyManager = (TelephonyManager) ctx.getSystemService(Activity.TELEPHONY_SERVICE);Class<?> clazz = null;Method method = null;//(int slotId)try {clazz = Class.forName("android.os.SystemProperties");method = clazz.getMethod("get", String.class, String.class);String gsm = (String) method.invoke(null, "ril.gsm.imei", "");String meid = (String) method.invoke(null, "ril.cdma.meid", "");map.put("meid", meid);if (!TextUtils.isEmpty(gsm)) {//the value of gsm like:xxxxxx,xxxxxxString imeiArray[] = gsm.split(",");if (imeiArray != null && imeiArray.length > 0) {map.put("imei1", imeiArray[0]);if (imeiArray.length > 1) {map.put("imei2", imeiArray[1]);} else {map.put("imei2", mTelephonyManager.getDeviceId(1));}} else {map.put("imei1", mTelephonyManager.getDeviceId(0));map.put("imei2", mTelephonyManager.getDeviceId(1));}} else {map.put("imei1", mTelephonyManager.getDeviceId(0));map.put("imei2", mTelephonyManager.getDeviceId(1));}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return map;}
}


Activity调用

if (Build.VERSION.SDK_INT < 21) {//如果获取系统的IMEI/MEID,14位代表meid 15位是imeiif (GetSystemInfoUtil.getNumber(getActivity()) == 14) {mTvPhoneMeid.setText(GetSystemInfoUtil.getImeiOrMeid(getActivity()));//meid} else if (GetSystemInfoUtil.getNumber(getActivity()) == 15) {mTvPhoneImei.setText(GetSystemInfoUtil.getImeiOrMeid(getActivity()));//imei1}// 21版本是5.0,判断是否是5.0以上的系统  5.0系统直接获取IMEI1,IMEI2,MEID} else if (Build.VERSION.SDK_INT >= 21) {Map<String, String> map = GetSystemInfoUtil.getImeiAndMeid(getActivity());mTvPhoneImei.setText(map.get("imei1"));//imei1mTvPhoneOtherImei.setText(map.get("imei2"));//imei2mTvPhoneMeid.setText(map.get("meid"));//meid}mTvPhoneSn.setText(GetSystemInfoUtil.getSn(getActivity()));//SNmTvPhoneModels.setText(GetSystemInfoUtil.getSystemModel());//手机型号 PRO6mTvVersionNumber.setText(GetSystemInfoUtil.getSystemVersion());//软件版本号  FLYME 6.02}




http://chatgpt.dhexx.cn/article/bNGSTenm.shtml

相关文章

MEID 的构成

MEID 的构成如下&#xff0c;针对 Hex 格式&#xff1a; 最后一位是 CD&#xff0c;这个 CD 不是 MEID 的组成部分&#xff0c;真正的 MEID 是前 14 位。在手机与基站进行 MEID 检查时&#xff0c;手机提交的 MEID 不能包含 CD 位&#xff0c;否则就会出错。当初设计此 CD 位主…

Mina MEID/GSM Activator 1.0 三网信号激活,支持iOS12.0~14.8.1

Mina团队已经更新工具&#xff0c;现在支持MEID/GSM三网和两网解锁信号&#xff01;支持iOS14.8系统&#xff0c;两网价格和三网价格一样。 Mina MEID/GSM Activator可以激活所有MEID/GSM二网、三网恢复信号&#xff0c;并且支持打电话、短信、4G流量上网&#xff0c;支持iPhon…

高通芯片联机读取修改串码 meid ESN wifi 蓝牙 sn等参数的操作解析{二}

上次我发了几个相关联机读写参数的帖子。很多友友询问有没有其他相关软件来解读参数的教程。今天就来个续集来解析参数读写 关于安卓机型写串码 改串码 端口开启和基带qcn等一些经验 高通联机修改IMEI等参数的相关解析 高通芯片基带相关的软件 QPST QXDM DFS等等&#xff0c…

说说移动设备的各种标识码(DeviceID, IMEI, UUID, UDID, OAID, IDFA, GAID)

转战广告行业&#xff0c;收集整理一波移动设备各种标识码的含义当做基础知识储备 一、名词解释 Device ID&#xff1a;设备ID。IMEI&#xff1a;&#xff08;International Mobile Equipment Identity&#xff09;国际移动设备标识的缩写。是由15位数字组成的“电子串号”&a…

Mina MEID/GSM Activator 1.0 三网信号激活,支持12.5.3~14.7

Mina团队已经更新工具&#xff0c;现在支持MEID/GSM三网和两网解锁信号&#xff01;支持iOS14.7系统&#xff0c;两网价格和三网价格一样。 Mina MEID/GSM Activator可以激活所有MEID/GSM二网、三网恢复信号&#xff0c;并且支持打电话、短信、4G流量上网&#xff0c;支持iPhon…

Mina MEID Activator 2.120210512更新使用说明支持三网(移动、联通、电信)国行版手机解锁打电话4G苹果手机激活锁停用Hello密码锁绕ID屏幕锁密码

Mina MEID Activator 是由Minacriss开发的新工具。可以激活所有MEID三网的信号恢复&#xff0c;并且支持打电话、短信、4G流量上网。支持iPhone5sX直接所有型号&#xff0c;支持iOS12.5.2iOS14.4.2。MEID三网指&#xff1a;不小心忘记ID密码&#xff0c;而且已经刷机并且是激活…

关于IMEI、MEID、IMSI

关于IMEI、MEID、IMSI 简介 IMEI、MEID都是用于标识一台物理设备的ID信息。在Android 8.0以下系统提供的API中&#xff0c;会根据不同条件返回二者之一的信息。 IMEI&#xff1a; 国际移动设备识别码&#xff0c;是区别移动设备的标志&#xff0c;一般用于标识某一台独立的设…

2022最新手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)教程

Android篇 1 IMEI和MEID (1) IMEI (International Mobile Equipment Identity) 是国际移动设备身份码的缩写&#xff0c;国际移动装备辨识码&#xff0c;只有Android手机才获取的到&#xff0c;是由15位数字组成的"电子串号"&#xff0c;比如像这样 35988103031435…

安卓唯一标识:IMEI,MEID,MAC地址,Android_id,UUID,OAID

目录 IMEI&#xff1a; MEID&#xff1a; MAC地址&#xff1a; Android_id&#xff1a; UUID&#xff1a; OAID&#xff1a; 安卓设备的唯一标识&#xff0c;获取的目的在于数据统计&#xff0c;广告归因分析等用途。常用作唯一标识的有IMEI&#xff0c;MEID&#xff0c;…

QA:MEID号申请、什么是MEID号、怎么申请MEID号、MEID号获取

本文671个字&#xff0c;正常大约需要阅读两分钟&#xff0c;完整阅读更精彩&#xff0c;欢迎点赞、转发或留言&#xff01; Q&#xff1a;什么是MEID号&#xff1f; A&#xff1a; MEID 移动设备识别码(Mobile Equipment Identifier)是CDMA手机的身份识别码&#xff0c;也是…

什么是MEID号如何申请MEID,A0、A1、A2以及99开头的MEID号的区别?

MEID/ESN号段ESN Manufacturer’s (MFR) Codes (ESN 厂家代码段) 主要适用于CDMA类的产品Mobile Equipment IDentifier&#xff08;MEID&#xff09;是全球唯一的56bit移动终端标识号需要向美国申请。标识号会被输入终端里&#xff0c;无法修改。可用来对移动式设备进行身份识别…

如何深入理解 StatsD 与 Graphite ?

众所周知&#xff0c;StatsD 负责收集并聚合测量值。之后&#xff0c;它会将数据传给 Graphite&#xff0c;后者以时间序列为依据存储数据&#xff0c;并绘制图表。但是&#xff0c;我们不知道&#xff0c;基于 http 访问的图表在展示时&#xff0c;是基于每秒钟的请求数&#…

graphite 监控 简介

graphite是一个监控业务数据的监控系统。&#xff0c;该系统架构如下&#xff1a; 系统分为三大组件&#xff1a; carbon&#xff1a; 负责后端数据采集,可以通过以下客户端来采集数据 客户端应用有多个方式来发布度量值&#xff1a; 使用一个纯文本协议工具比如 netcat (n…

graphite在centos7上的部署搭建

Graphite安装笔记 实验环境&#xff1a; CentOS7.5 x64 部署python的程序推荐使用virtualenv这列的虚拟环境来进行&#xff0c;防止污染系统自带的python包。 安装一些必要的rpm包 yum install cairo -- 另外的2个包 cairo-devel pycairo 可以不用安装 安装virtualenv yum ins…

Graphite Simulator模拟器详解

Graphite模拟器 Graphite Simulator是由MIT的Carbon研究组开发的一款并行分布式全系统模拟器。设计目标是针对与未来的多核甚至千核&#xff0c;提供高性能的设计和软件开发平台。使用了直接执行、无缝多核和多机分布、可分析性建模、松散同步等技术来提高模拟性能。提供了功能…

业务监控系统如何做,一起来看看如何使用Statsd+Graphite+Grafana搭建业务监控系统

背景介绍 希望能够对业务指标监控&#xff0c;通过业务指标监控反应业务系统的稳定性&#xff0c;原因是通过对基础资源&#xff0c;应用服务状态&#xff0c;性能监控&#xff0c;不能够反应业务系统的稳定性&#xff0c;举个栗子&#xff1a;服务程序一切正常&#xff0c;下…

Spark 应用监控告警-Graphite_exporter

Spark 应用监控告警-Graphite_exporter Spark监控和工具 Web界面事后查看REST API度量高级工具一、下载graphite_exporter 1.1 修改graphite_exporter_mapping1.2 启动graphite_exporter二、Spark配置Graphite metrics三、启动Spark程序四、配置Prometheus 4.1 查看Prometheus…

Graphite系统监控

转载至 : http://my.oschina.net/fufangchun/blog/232895?p1 目录[-] 一、简介&#xff1a; 二、Graphite的安装及配置 0.Graphite目录 1.安装环境 2.所需软件 3.安装依赖 4.安装Graphite组件 ①.检查依赖&#xff1a; ②.安装graphite-web&#xff1a; ②.安装whisper&#x…

【大数据监控】Prometheus、Node_exporter、Graphite_exporter安装部署详细文档

目录 Prometheus简介下载软件包安装部署创建用户创建Systemd服务修改配置文件prometheus.yml启动Prometheus node exporter下载软件包安装部署创建systemd服务启动node_exporter graphite_exporter下载软件包安装部署创建systemd服务启动 graphite_exporter Prometheus 简介 P…

docker部署grafana graphite stastd实时监控告警配置_亲测成功

docker部署grafana graphite stastd实时监控告警配置_亲测成功 实时监控请求的次数和响应时间及异常报警 项目中需要监控API接口的调用情况,如:调用次数,每次调用耗时,调用高峰期,异常报警等 grafana graphite stastd这一套对代码没有侵入,也不会影响接口性能 安装docker环…