package com.cheng.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.content.Context;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
/**
* IMSI工具类
*/
public class ImsiUtil {
private Integer simId_1 = 0;
private Integer simId_2 = 1;
private String imsi_1 = "";
private String imsi_2 = "";
private String imei_1 = "";
private String imei_2 = "";
private Context mContext;
public ImsiUtil(Context mContext) {
// TODO Auto-generated constructor stub
this.mContext = mContext;
}
/**
* 获取IMSInfo
* @return
*/
public IMSInfo getIMSInfo() {
IMSInfo imsInfo = initQualcommDoubleSim();
if (imsInfo != null) {
return imsInfo;
} else {
imsInfo = initMtkDoubleSim();
if (imsInfo != null) {
return imsInfo;
} else {
imsInfo = initMtkSecondDoubleSim();
if (imsInfo != null) {
return imsInfo;
} else {
imsInfo = initSpreadDoubleSim();
if (imsInfo != null) {
return imsInfo;
} else {
imsInfo = getIMSI();
if (imsInfo != null) {
return imsInfo;
} else {
imsInfo = null;
return imsInfo;
}
}
}
}
}
}
/**
* MTK的芯片的判断
* @return
*/
public IMSInfo initMtkDoubleSim() {
IMSInfo imsInfo = null;
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);
imsInfo = new IMSInfo();
imsInfo.chipName = "MTK芯片";
imsInfo.imei_1 = imei_1;
imsInfo.imei_2 = imei_2;
imsInfo.imsi_1 = imsi_1;
imsInfo.imsi_2 = imsi_2;
} catch (Exception e) {
imsInfo = null;
return imsInfo;
}
return imsInfo;
}
/**
* MTK的芯片的判断2
* @return
*/
public IMSInfo initMtkSecondDoubleSim() {
IMSInfo imsInfo = null;
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();
imsInfo = new IMSInfo();
imsInfo.chipName = "MTK芯片";
imsInfo.imei_1 = imei_1;
imsInfo.imei_2 = imei_2;
imsInfo.imsi_1 = imsi_1;
imsInfo.imsi_2 = imsi_2;
} catch (Exception e) {
imsInfo = null;
return imsInfo;
}
return imsInfo;
}
/**
* 展讯芯片的判断
* @return
*/
public IMSInfo initSpreadDoubleSim() {
IMSInfo imsInfo = null;
try {
Class<?> c = Class
.forName("com.android.internal.telephony.PhoneFactory");
Method m = c.getMethod("getServiceName", String.class, int.class);
String 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();
TelephonyManager tm1 = (TelephonyManager) mContext
.getSystemService(spreadTmService);
imsi_2 = tm1.getSubscriberId();
imei_2 = tm1.getDeviceId();
imsInfo = new IMSInfo();
imsInfo.chipName = "展讯芯片";
imsInfo.imei_1 = imei_1;
imsInfo.imei_2 = imei_2;
imsInfo.imsi_1 = imsi_1;
imsInfo.imsi_2 = imsi_2;
} catch (Exception e) {
imsInfo = null;
return imsInfo;
}
return imsInfo;
}
/**
* 高通芯片判断
* @return
*/
public IMSInfo initQualcommDoubleSim() {
IMSInfo imsInfo = null;
try {
Class<?> cx = Class
.forName("android.telephony.MSimTelephonyManager");
Object obj = mContext.getSystemService("phone_msim");
Method md = cx.getMethod("getDeviceId", int.class);
Method ms = cx.getMethod("getSubscriberId", int.class);
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_2 = 0;
boolean flag = false;
try {
Method mx = cx.getMethod("getPreferredDataSubscription",
int.class);
Method is = cx.getMethod("isMultiSimEnabled", int.class);
statephoneType_2 = (Integer) mx.invoke(obj);
flag = (Boolean) is.invoke(obj);
} catch (Exception e) {
// TODO: handle exception
}
imsInfo = new IMSInfo();
imsInfo.chipName = "高通芯片-getPreferredDataSubscription:"
+ statephoneType_2 + ",flag:" + flag;
imsInfo.imei_1 = imei_1;
imsInfo.imei_2 = imei_2;
imsInfo.imsi_1 = imsi_1;
imsInfo.imsi_2 = imsi_2;
} catch (Exception e) {
imsInfo = null;
return imsInfo;
}
return imsInfo;
}
/**
* 系统的api
* @return
*/
public IMSInfo getIMSI() {
IMSInfo imsInfo = null;
try {
TelephonyManager tm = (TelephonyManager) mContext
.getSystemService(Context.TELEPHONY_SERVICE);
imsi_1 = tm.getSubscriberId();
imei_1 = tm.getDeviceId();
} catch (Exception e) {
// TODO: handle exception
imsInfo = null;
return imsInfo;
}
if (TextUtils.isEmpty(imsi_1) || imsi_1.length() < 10) {
imsInfo = null;
return imsInfo;
} else {
imsInfo = new IMSInfo();
imsInfo.chipName = "单卡芯片";
imsInfo.imei_1 = imei_1;
imsInfo.imei_2 = "没有";
imsInfo.imsi_1 = imsi_1;
imsInfo.imsi_2 = "没有";
return imsInfo;
}
}
public class IMSInfo {
public String chipName;
public String imsi_1;
public String imei_1;
public String imsi_2;
public String imei_2;
}
}