关于android各种双卡手机获取imei,imsi的处理(mtk,展讯,高通等)
目前国内对于双卡智能手机的需求还是很大的,各种复杂的业务会涉及到双卡模块;而android标准的api又不提供对双卡的支持。导致国内双卡模块标准混乱,各个厂商各玩各的。目前我知道的双卡解决方案就有:mtk,展讯,高通,broadcom等。
由于公司业务需要,必须要对双卡手机获取各自的imei,imsi,所以也做了一些研究:
首先是最为应用广泛的mtk平台,国内山寨手机以及一些低端品牌双卡都是做的mtk的双卡解决方案
private static void initMtkDoubleSim() {
try {
TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
Class<?> c = Class.forName("com.android.internal.telephony.Phone");
Field fields1 = c.getField("GEMINI_SIM_1");
fields1.setAccessible(true);
simId_1 = (Integer) fields1.get(null);
Field fields2 = c.getField("GEMINI_SIM_2");
fields2.setAccessible(true);
simId_2 = (Integer) fields2.get(null);
Method m = TelephonyManager.class.getDeclaredMethod(
"getSubscriberIdGemini", int.class);
imsi_1 = (String) m.invoke(tm, simId_1);
imsi_2 = (String) m.invoke(tm, simId_2);
Method m1 = TelephonyManager.class.getDeclaredMethod(
"getDeviceIdGemini", int.class);
imei_1 = (String) m1.invoke(tm, simId_1);
imei_2 = (String) m1.invoke(tm, simId_2);
Method mx = TelephonyManager.class.getDeclaredMethod(
"getPhoneTypeGemini", int.class);
phoneType_1 = (Integer) mx.invoke(tm, simId_1);
phoneType_2 = (Integer) mx.invoke(tm, simId_2);
if (TextUtils.isEmpty(imsi_1) && (!TextUtils.isEmpty(imsi_2))) {
defaultImsi = imsi_2;
}
if (TextUtils.isEmpty(imsi_2) && (!TextUtils.isEmpty(imsi_1))) {
defaultImsi = imsi_1;
}
} catch (Exception e) {
isMtkDoubleSim = false;
return;
}
isMtkDoubleSim = true;
}
可见,在TelephonyManager中提供了**Gemini的方法,可以用反射很方便地获取到相应的信息。
还有
private static void initMtkSecondDoubleSim() {
try {
TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
Class<?> c = Class.forName("com.android.internal.telephony.Phone");
Field fields1 = c.getField("GEMINI_SIM_1");
fields1.setAccessible(true);
simId_1 = (Integer) fields1.get(null);
Field fields2 = c.getField("GEMINI_SIM_2");
fields2.setAccessible(true);
simId_2 = (Integer) fields2.get(null);
Method mx = TelephonyManager.class.getMethod("getDefault",
int.class);
TelephonyManager tm1 = (TelephonyManager) mx.invoke(tm, simId_1);
TelephonyManager tm2 = (TelephonyManager) mx.invoke(tm, simId_2);
imsi_1 = tm1.getSubscriberId();
imsi_2 = tm2.getSubscriberId();
imei_1 = tm1.getDeviceId();
imei_2 = tm2.getDeviceId();
phoneType_1 = tm1.getPhoneType();
phoneType_2 = tm2.getPhoneType();
if (TextUtils.isEmpty(imsi_1) && (!TextUtils.isEmpty(imsi_2))) {
defaultImsi = imsi_2;
}
if (TextUtils.isEmpty(imsi_2) && (!TextUtils.isEmpty(imsi_1))) {
defaultImsi = imsi_1;
}
} catch (Exception e) {
isMtkSecondDoubleSim = false;
return;
}
isMtkSecondDoubleSim = true;
}
看样子有似乎也是属于mtk平台的解决方案,因为都有GEMINI_SIM_1属性,这种双卡方案只在联想278t上发现过;有两个TelephonyManager实例,根据getDefault方法获取
下面是展讯平台的(貌似市面上手机不多啊):
private static void initSpreadDoubleSim() {
try {
Class<?> c = Class
.forName("com.android.internal.telephony.PhoneFactory");
Method m = c.getMethod("getServiceName", String.class, int.class);
spreadTmService = (String) m
.invoke(c, Context.TELEPHONY_SERVICE, 1);
TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
imsi_1 = tm.getSubscriberId();
imei_1 = tm.getDeviceId();
phoneType_1 = tm.getPhoneType();
TelephonyManager tm1 = (TelephonyManager) mContext.getSystemService(spreadTmService);
imsi_2 = tm1.getSubscriberId();
imei_2 = tm1.getDeviceId();
phoneType_2 = tm1.getPhoneType();
if (TextUtils.isEmpty(imsi_1) && (!TextUtils.isEmpty(imsi_2))) {
defaultImsi = imsi_2;
}
if (TextUtils.isEmpty(imsi_2) && (!TextUtils.isEmpty(imsi_1))) {
defaultImsi = imsi_1;
}
} catch (Exception e) {
isSpreadDoubleSim = false;
return;
}
isSpreadDoubleSim = true;
}
这个没有展讯sdk的话还是很难找的吧?
下面是高通的:(貌似高通做的不咋的有些接口没有双卡实现啊)
public static void initQualcommDoubleSim() {
try {
TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
Class<?> cx = Class
.forName("android.telephony.MSimTelephonyManager");
Object obj =mContext.getSystemService(
"phone_msim");
simId_1 = 0;
simId_2 = 1;
Method mx = cx.getMethod("getDataState");
// int stateimei_1 = (Integer) mx.invoke(cx.newInstance());
int stateimei_2 = tm.getDataState();
Method mde = cx.getMethod("getDefault");
Method md = cx.getMethod("getDeviceId", int.class);
Method ms = cx.getMethod("getSubscriberId", int.class);
Method mp = cx.getMethod("getPhoneType");
// Object obj = mde.invoke(cx);
imei_1 = (String) md.invoke(obj, simId_1);
imei_2 = (String) md.invoke(obj, simId_2);
imsi_1 = (String) ms.invoke(obj, simId_1);
imsi_2 = (String) ms.invoke(obj, simId_2);
int statephoneType_1 = tm.getDataState();
int statephoneType_2 = (Integer) mx.invoke(obj);
Log.e("tag", statephoneType_1 + "---" + statephoneType_2);
// Class<?> msc = Class.forName("android.telephony.MSimSmsManager");
// for (Method m : msc.getMethods()) {
// if (m.getName().equals("sendTextMessage")) {
// m.getParameterTypes();
// }
// Log.e("tag", m.getName());
// }
} catch (Exception e) {
isQualcommDoubleSim = false;
return;
}
isQualcommDoubleSim = true;
}
getPhoneType&getDataState 方法看了底层发现没有双卡实现,目前也不知道该咋办...
关于android各种双卡手机获取imei,imsi的处理(mtk,展讯,高通等)的更多相关文章
- android双待手机获取每一张SIM卡的imei
/** * create a TelephonyInfo.java class */import java.lang.reflect.Method; import android.content.Co ...
- Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题
由于国内的运营商问题,双卡手机获取IMSI号问题要根据厂商API 来实现. 下面我们就来做一套完整的分析运营商获取IMSI号逻辑. 1,首先我们要判断手机的平台. 1.1,判断手机是否MTK平台 1 ...
- Android图形合成和显示系统---基于高通MSM8k MDP4平台
介绍了Android SurfaceFlinger层次以下的图形合成和显示系统,主要基于高通MSM8k MDP4x平台. 做为Android Display专题.SurfaceFlinger的详细介绍 ...
- 【转】高通平台android 环境配置编译及开发经验总结
原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...
- android系统中使用TelephonyManager类来获取imei号和其他手机信息
在AndroidManifest.xml文件中增加<!--允许读取电话状态SIM的权限--><uses-permission android:name="android.p ...
- Android编程获取手机的IMEI
手机在生产时,每部手机均有一个唯一的标识(ID),国际上采用国际移动设备身份码(IMEI, International Mobile Equipment Identity).IMEI是由15位数字组成 ...
- Android 获取imei号码,获取手机型号和系统版本号
在AndroidManifest.xml文件中要添加 <uses-permission android:name="android.permission.READ_PHONE_STAT ...
- android 获取IMEI号
android 获取 imei号码 核心代码: Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId( ...
- android 获取 imei号码 及相关信息
android 获取 imei号码 参考:http://www.cnblogs.com/luxiaofeng54/archive/2011/03/01/1968063.html 核心代码: Imei ...
随机推荐
- 安装pip之后,执行pip,提示:unknown or unsupported command install
安装pip之后,在dos命令框中输入pip,提示:unknown or unsupported command install,搜索之后,立马在:http://stackoverflow.com/qu ...
- 在ios开发中有多少常用的加密解密方式(备用)
最常用的是MD5和base64编码,还有DES 3DES AES加密 ios怎么实现RAS加密解密 最近几天折腾了一下如何在iOS上使用RSA来加密.iOS上并没有直接的RSA加密API.但是iOS提 ...
- Python的数据类型总结
原地可变类型和不可变类型 原地不可变类型又叫可哈希(hashable)类型,原地可变类型又叫不可哈希类型. 原地不可变类型: 数字类型:int, float, decimal.Decimal, fra ...
- matplotlib 显示中文
# --*-- coding: utf-8 --*-- from matplotlib.font_manager import FontProperties import matplotlib.pyp ...
- java service
http://www.regexlab.com/zh/jar2exe/demo1.htm http://www.zhangxinxu.com/wordpress/?p=1058 http://www. ...
- Colored Sticks
poj2513:http://poj.org/problem?id=2513 题意:就是求一个欧拉回路. 题解:本题是判断欧拉通路是否存在,但是如果是用map的话就会超时,这里采用了trie树,有发现 ...
- IntelliJ IDEA SVN的账号修改 信息清除
来到编译器的setting设置 搜索subversion 点击subversion 找到下面的clear auth...按钮,点击一下 就可以了
- 基于Delphi的Socket I/O模型全接触 good
老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系.他们的信会被邮递员投递到他们的信箱里. 这和Socket模型非常类似.下面我就以老陈接收信件为例讲解Socket I/O模型. 一:se ...
- user模式下编译android 代码被proguard优化导致类和变量丢失
在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了.所以,在JNI应用中该慎用progurad啊. 解决办法: 1.在An ...
- 【HDOJ】3560 Graph’s Cycle Component
并查集的路径压缩. #include <stdio.h> #include <string.h> #define MAXNUM 100005 int deg[MAXNUM], ...