最近接触了一个项目,需要获取在线流量卡的信息,下面的方式,可以获取大部分手机的正确手机卡信息。
一 获取获取IMEI
public static String getDeviced(int soltId,Context context) {
return (String) getPhoneInfo(soltId,"getDeviceId", context);
}
获取 IMSI
public static String getSubscriberId(intsubId, Context context) {
String imsi= (String) getPhoneInfo(subId, "getSubscriberId", context);returnimsi;
}
获取 iccid
public static String getSimSerialNumber(intsubId, Context context) {
String imsi= (String) getPhoneInfo(subId, "getSimSerialNumber", context);returnimsi;
}
subId 为卡槽 id
二、双卡的时候获取哪个卡是使用流量的卡
@SuppressLint("MissingPermission")public staticInteger getDefaultDataSubId(Context context)
{
Integer id= -1;try{
SubscriptionManager sm= null;if (android.os.Build.VERSION.SDK_INT >=android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
sm=SubscriptionManager.from(context.getApplicationContext());
Method getSubId= sm.getClass().getMethod("getDefaultDataSubId");if(getSubId != null)
{
id= (int) getSubId.invoke(sm);
}
}
}catch(NoSuchMethodException e) {try{
SubscriptionManager sm= null;if (android.os.Build.VERSION.SDK_INT >=android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
sm=SubscriptionManager.from(context.getApplicationContext());
Method getSubId= sm.getClass().getMethod("getDefaultDataSubscrptionId");if(getSubId != null)
{
id= (int) getSubId.invoke(sm);
}
}
}catch(NoSuchMethodException e1) {// try{
SubscriptionManager sm= null;if (android.os.Build.VERSION.SDK_INT >=android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
sm=SubscriptionManager.from(context.getApplicationContext());
Method getSubId= sm.getClass().getMethod("getDefaultDataPhoneId");//Method getSubId = Class.forName("android.telephony.SubscriptionManager").getDeclaredMethod("getSubId", new Class[]{Integer.TYPE});
if(getSubId != null)
{
id= (int) getSubId.invoke(sm);
Log.v("",(int) getSubId.invoke(sm) + "");
}
}
}catch(NoSuchMethodException e2) {
e.printStackTrace();
}catch(IllegalAccessException e2) {
e.printStackTrace();
}catch(InvocationTargetException e2) {
e.printStackTrace();
}
}catch(IllegalAccessException e1) {
e.printStackTrace();
}catch(InvocationTargetException e1) {
e.printStackTrace();
}
}catch(IllegalAccessException e) {
e.printStackTrace();
}catch(InvocationTargetException e) {
e.printStackTrace();
}returnid;
}
使用 getDefaultDataSubId 可以获取大部分手机哪个是在线的数据的卡 ,getDefaultDataSubscrptionId 是荣耀系列的手机能获取到,但小米、红米.vivo 等手机的获取不到。
上面两个可以获取大部分的,三星的好像不行,三星的把副卡的数据流量打开时,会自动关闭主卡。三星的使用 这个getDefaultDataPhoneId , 这个可以获取到三星的哪个手机卡在线吗,但是当使用上面的获取SIMI 的方法时,两个卡,返回的都是主卡的值。
对三星的手机做了一下特殊处理:
if ( Utils.getSubscriberId(0,mContext).equals( Utils.getSubscriberId(1,mContext))) {if (id == 1) {
imsi=SystemUtil.getPhoneIMSI(mContext);
imei=SystemUtil.getIMEI(mContext);
iccid=SystemUtil.getPhoneICCID(mContext);
}else{
imsi=Utils.getSubscriberId(id,mContext);
imei=Utils.getDeviced(id,mContext);
iccid=Utils.getSimSerialNumber(id,mContext);
}
}else{
imsi=Utils.getSubscriberId(id,mContext);
imei=Utils.getDeviced(id,mContext);
iccid=Utils.getSimSerialNumber(id,mContext);
}
当传 0、 1 时获取到的SIMI 信息一样时
获取副卡信息 使用 下面的方法
@SuppressLint("MissingPermission")public staticString getPhoneIMSI(Context context) {
TelephonyManager mTelephonyMgr=(TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
String str= "";try{
str=mTelephonyMgr.getSubscriberId();
}catch(Exception e) {
str= "";
}returnstr;
}
@SuppressLint("MissingPermission")public staticString getIMEI(Context ctx) {
TelephonyManager tm=(TelephonyManager) ctx.getSystemService(Activity.TELEPHONY_SERVICE);if (tm != null) {try{returntm.getDeviceId();
}catch(Exception e) {return "";
}
}return null;
}
@SuppressLint("MissingPermission")public staticString getPhoneICCID(Context context) {
TelephonyManager mTelephonyMgr=(TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);try{returnmTelephonyMgr.getSimSerialNumber();
}catch(Exception e) {return "";
}
}
获取主卡信息 ,还可以使用 一 标题里面的方法。