获取双卡手机IMEI、IMSI
转载请注明出处:
现在 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)
等方法,可以根据slotId
、subId
来获取不同卡槽的信息,但是这些方法是hide
方法,被系统隐藏了。然而在 API 23
及以后,系统开放了 public String getDeviceId(int slotId)
方法。至此,可以想到我们的实现思路是,在 Android 5.0
及之后,通过反射系统方法来获取双卡的IMEI和IMSI信息。
在这里解释一下上文提到的 slotId
,subId
。slotId
为卡槽Id,它的值为 0
、1
;subId
为卡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相关推荐
- android获取imei兼容_Android如何获取双卡手机IMEI的方法示例
前言: 项目中有个统计付费广告转化率的需求,需要获取用户手机的IMEI.但是网上最常见的方法有坑,也就是TelephonyManager.getDeviceId(),这方法有可能获取的是MEID或者空 ...
- 安卓iccid_Android 获取双卡手机IMEI,IMSI,ICCID
一.首先要添加权限 二.获取主卡的IMEI,IMSI,ICCID /** * Author: liuqiang * Time: 2017-08-14 15:28 * Description: * * ...
- Android 获取双卡手机IMEI,IMSI,ICCID
一.首先要添加权限 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 二.获 ...
- 获取双卡手机的两个卡的IMSI
/** * 获取双卡手机的两个卡的IMSI 需要 READ_PHONE_STATE 权限 * * @param context * 上下文 * @return 下标0为一卡的IMSI,下标1为二卡的I ...
- C/C++获取安卓手机IMEI编号demo
C/C++获取安卓手机IMEI编号demo #include <stdlib.h> #include <exception> #include <fstream> ...
- 获得手机IMEI IMSI
IMSI也就是SIM卡号,是用户的唯一标识,IMSI号码结构为: MCC------------- MNC------------------ MSIN MCC=移动国家号码,由3位数字组成,唯一地识 ...
- 查看手机IMEI IMSI
通过拨号查看 IMSI:*#*#4636#*#* IMEI:*#06# 挖坑 后续介绍 两者不同
- android 获取双卡手机信息
android本身SDK不支持双卡,只能通过其他双卡的商家提供的API进行获取.听说android5.0的SDK开始支持双卡,等待中--
- 【记录】 Android 双卡手机获取IMEI等
1.前言 项目中遇到上传手机imei的问题.如果手机是双卡,目前只能获取默认的imei TelephonyManager mTelephonyMgr = (TelephonyManager) getS ...
最新文章
- 车道线检测:几何约束联合车道分割和车道边界检测
- 使用R构建Xgboost模型并绘制ROC曲线
- python的excel库_Python-excel相关库
- qt撤销与回退_Qt动画框架
- error:use of undeclared identifier
- 这本 “写不完” 的黑科技笔记本,恐怕要颠覆整个行业!
- mysql 5.6自动任务_mysql定时执行某任务
- 让人兴奋的视差滚动(Parallax Scrolling)效果网站分享
- 听说下雨天,子序列和孤单的你更配哦~
- 抛砖引玉,终于完成了自己的客户端校验提示Extender
- 2021江西高考成绩6月23日几点查询,2021年江西高考成绩查询时间:6月23日
- A - Six Degrees of Cowvin Bacon POJ - 2139 最短路Floyd
- 我们都是穷人甲乙丙丁
- png在ai转为路径_ai怎么把png转换为路径
- Matlab读取股票数据
- How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)
- “Adb connection Error:远程主机强迫关闭了一个现有的连接。”的解决方法
- 一文看懂Lambda
- iconfont本地引入显示小方块问题
- Confluence使用教程
热门文章
- 怎么把ofd转换成PDF文件?分享给你个好用的方法。
- mt6799芯片资料mt6799参考设计资料
- 什么是批标准化 (Batch Normalization)
- 什么是keep-alive?
- Laravel Trait method broker has not been applied, because there are collisions with other trait meth
- 用什么软件测试高考成绩,优志愿、知涯升学等志愿填报软件测评出来啦!最好用的是这个...
- Android Notification取消声音 取消弹出
- 【Emacs】之 Org-mode
- 独立游戏如何俘获全球玩家 | Google Play 开发者中文播客节目
- Chainlink 预言机新技术研发成果 - CCIP,DECO,FSS 和 OCR 2.0