转载请注明出处:
现在 Android 手机越来越多的使用双卡双待,对于安装双卡的手机,有时我们想要获取两张卡的IMSI、IMEI等信息。我们知道 Android 中提供了相关 api,通过类 TelephonyManager可以获取IMSI、IMEI等信息,注意:在Android M及以后,在使用类TelephoneManager之前,需要动态申请权限android.permission.READ_PHONE_STATE,否则获取到的信息可能为空。
但是TelephoneManager提供的public String getDeviceId(),public String getSubscriberId()等API,只能返回默认的一个IMEI、IMSI,并不能获取双卡的信息。在 Android 5.0 之后,系统加入了public String getDeviceId(int slotId),public String getSubscriberId(int subId)等方法,可以根据slotIdsubId来获取不同卡槽的信息,但是这些方法是hide方法,被系统隐藏了。然而在 API 23及以后,系统开放了 public String getDeviceId(int slotId) 方法。至此,可以想到我们的实现思路是,在 Android 5.0 及之后,通过反射系统方法来获取双卡的IMEI和IMSI信息。
在这里解释一下上文提到的 slotIdsubIdslotId为卡槽Id,它的值为 01subId为卡Id,相当于在手机卡插到手机上时,系统为卡分配的一个标识Id,这个值通过ContentProvider来获取。

public static int getSubId(int slotId, Context context) {Uri uri = Uri.parse("content://telephony/siminfo");Cursor cursor = null;ContentResolver contentResolver = context.getContentResolver();try {cursor = contentResolver.query(uri, new String[] {"_id", "sim_id"}, "sim_id = ?", new String[] {String.valueOf(slotId)}, null);if (null != cursor) {if (cursor.moveToFirst()) {return cursor.getInt(cursor.getColumnIndex("_id"));}}} catch (Exception e) {LogUtil.d("getSubId", e.toString());} finally {if (null != cursor) {cursor.close();}}return -1;}

讲一下通过反射获取IMEI、IMSI的思路:
1、通过方法名来获取方法的参数列表

public static Class[] getMethodParamTypes(String methodName) {Class[] params = null;try {Method[] methods = TelephonyManager.class.getDeclaredMethods();for (int i = 0; i < methods.length; i++) {if (methodName.equals(methods[i].getName())) {params = methods[i].getParameterTypes();if (params.length >= 1) {LogUtil.d("length:", "" + params.length);break;}}}} catch (Exception e) {LogUtil.d("", e.toString());}return params;}

2、通过subId和方法名来获取该方法的返回值

public static Object getPhoneInfo(int subId, String methodName, Context context) {Object value = null;try {TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);if (Build.VERSION.SDK_INT >= 21) {Method method = tm.getClass().getMethod(methodName, getMethodParamTypes(methodName));if (subId >= 0) {value = method.invoke(tm, subId);}}} catch (Exception e) {LogUtil.d("", e.toString());}return value;}

3、获取IMEI和IMSI的值

    // imeipublic static String getDeviced(Context context, int soltId) {return (String) getPhoneInfo(soltId "getDeviceId", context);}// imsipublic static String getSubscriberId(int subId, Context context) {String imsi = (String) getPhoneInfo(subId, "getSubscriberId", context);return imsi;}

通过以上方式,可以获取Android 5.0以后双卡手机的IMEI、IMSI信息。这里解释下步骤1为何通过通过反射来获取参数列表,因为发现在部分机型上获取到的参数类型有long类型,所以直接通过反射的方式来获取了。
以上方法,亲测一加3、华为Mate8、小米Note、VIVO X6PlusA、荣耀V9可用。

获取双卡手机IMEI、IMSI相关推荐

  1. android获取imei兼容_Android如何获取双卡手机IMEI的方法示例

    前言: 项目中有个统计付费广告转化率的需求,需要获取用户手机的IMEI.但是网上最常见的方法有坑,也就是TelephonyManager.getDeviceId(),这方法有可能获取的是MEID或者空 ...

  2. 安卓iccid_Android 获取双卡手机IMEI,IMSI,ICCID

    一.首先要添加权限 二.获取主卡的IMEI,IMSI,ICCID /** * Author: liuqiang * Time: 2017-08-14 15:28 * Description: * * ...

  3. Android 获取双卡手机IMEI,IMSI,ICCID

    一.首先要添加权限 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 二.获 ...

  4. 获取双卡手机的两个卡的IMSI

    /** * 获取双卡手机的两个卡的IMSI 需要 READ_PHONE_STATE 权限 * * @param context * 上下文 * @return 下标0为一卡的IMSI,下标1为二卡的I ...

  5. C/C++获取安卓手机IMEI编号demo

    C/C++获取安卓手机IMEI编号demo #include <stdlib.h> #include <exception> #include <fstream> ...

  6. 获得手机IMEI IMSI

    IMSI也就是SIM卡号,是用户的唯一标识,IMSI号码结构为: MCC------------- MNC------------------ MSIN MCC=移动国家号码,由3位数字组成,唯一地识 ...

  7. 查看手机IMEI IMSI

    通过拨号查看 IMSI:*#*#4636#*#* IMEI:*#06# 挖坑 后续介绍 两者不同

  8. android 获取双卡手机信息

    android本身SDK不支持双卡,只能通过其他双卡的商家提供的API进行获取.听说android5.0的SDK开始支持双卡,等待中--

  9. 【记录】 Android 双卡手机获取IMEI等

    1.前言 项目中遇到上传手机imei的问题.如果手机是双卡,目前只能获取默认的imei TelephonyManager mTelephonyMgr = (TelephonyManager) getS ...

最新文章

  1. 车道线检测:几何约束联合车道分割和车道边界检测
  2. 使用R构建Xgboost模型并绘制ROC曲线
  3. python的excel库_Python-excel相关库
  4. qt撤销与回退_Qt动画框架
  5. error:use of undeclared identifier
  6. 这本 “写不完” 的黑科技笔记本,恐怕要颠覆整个行业!
  7. mysql 5.6自动任务_mysql定时执行某任务
  8. 让人兴奋的视差滚动(Parallax Scrolling)效果网站分享
  9. 听说下雨天,子序列和孤单的你更配哦~
  10. 抛砖引玉,终于完成了自己的客户端校验提示Extender
  11. 2021江西高考成绩6月23日几点查询,2021年江西高考成绩查询时间:6月23日
  12. A - Six Degrees of Cowvin Bacon POJ - 2139 最短路Floyd
  13. 我们都是穷人甲乙丙丁
  14. png在ai转为路径_ai怎么把png转换为路径
  15. Matlab读取股票数据
  16. How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)
  17. “Adb connection Error:远程主机强迫关闭了一个现有的连接。”的解决方法
  18. 一文看懂Lambda
  19. iconfont本地引入显示小方块问题
  20. Confluence使用教程

热门文章

  1. 怎么把ofd转换成PDF文件?分享给你个好用的方法。
  2. mt6799芯片资料mt6799参考设计资料
  3. 什么是批标准化 (Batch Normalization)
  4. 什么是keep-alive?
  5. Laravel Trait method broker has not been applied, because there are collisions with other trait meth
  6. 用什么软件测试高考成绩,优志愿、知涯升学等志愿填报软件测评出来啦!最好用的是这个...
  7. Android Notification取消声音 取消弹出
  8. 【Emacs】之 Org-mode
  9. 独立游戏如何俘获全球玩家 | Google Play 开发者中文播客节目
  10. Chainlink 预言机新技术研发成果 - CCIP,DECO,FSS 和 OCR 2.0